📌  相关文章
📜  '字段列表中的 C# 未知列'FundAllocation' - C# (1)

📅  最后修改于: 2023-12-03 15:29:06.688000             🧑  作者: Mango

'字段列表中的 C# 未知列'FundAllocation' - C#

在 C# 中,处理过程中经常会遇到未知列的情况,特别是在使用字符串截取和分割时。本文将介绍一种解决这种问题的方法。

问题描述

在某些情况下,我们可能会从数据库中查询到一些特殊的数据,例如以下示例数据:

| Id | Funds | | ---- | ---------------------------| | 1 | 10.00,20.00,30.00,40.00 | | 2 | 100.00,200.00,300.00 | | 3 | 50.00,60.00,70.00,80.00 |

我们希望将 Funds 列拆分成不同的列,例如,将第一列拆分成四列,如下所示:

| Id | Fund1 | Fund2 | Fund3 | Fund4 | | ---- | -----| ------| ------| ------| | 1 | 10.00| 20.00 | 30.00 | 40.00 | | 2 | 100.00| 200.00| 300.00| null | | 3 | 50.00| 60.00 | 70.00 | 80.00 |

解决方法

我们可以使用 C# 中的 Split 方法来将字符串分割成数组。例如,以下代码将字符串 "10.00,20.00,30.00,40.00" 分割成一个长度为 4 的数组:

string funds = "10.00,20.00,30.00,40.00";
string[] splitFunds = funds.Split(',');

然而,如果 Funds 列的长度是不确定的,我们该如何处理呢?在这种情况下,我们可以利用 C# 中的动态属性和 ExpandoObject 类型来解决问题。

我们可以定义一个名为 "DynamicCsvConverter" 的帮助类,该类可以将一个逗号分隔的字符串转换为动态对象。示例如下:

using System.Dynamic;
using System.Linq;

public static class DynamicCsvConverter
{
    public static dynamic ToDynamic(string csv)
    {
        var columns = csv.Split(',');
        var obj = new ExpandoObject() as IDictionary<string, object>;
        for (var i = 0; i < columns.Length; i++)
        {
            obj.Add("Column" + i, columns[i]);
        }
        return obj;
    }
}

然后,我们可以使用 Linq 查询来将原始数据转换为新的列,如下所示:

var data = new List<dynamic>()
{
    DynamicCsvConverter.ToDynamic("10.00,20.00,30.00,40.00"),
    DynamicCsvConverter.ToDynamic("100.00,200.00,300.00"),
    DynamicCsvConverter.ToDynamic("50.00,60.00,70.00,80.00"),
};

var result = data.Select(d => new {
    Id = d.Column0,
    Fund1 = d.Contains("Column1") ? d.Column1 : null,
    Fund2 = d.Contains("Column2") ? d.Column2 : null,
    Fund3 = d.Contains("Column3") ? d.Column3 : null,
    Fund4 = d.Contains("Column4") ? d.Column4 : null,
});

这样,我们就可以将 Funds 列拆分成多个列,且不受长度限制。

总结

本文介绍了一种在 C# 中处理未知列的方法,该方法可以利用动态属性和 Linq 查询来拆分逗号分隔的字符串。希望本文对你有所帮助。