组合匿名列以形成新集合

时间:2012-03-07 13:24:44

标签: c# linq

我一直在审查这里的许多帖子/回复,但没有找到(或者可能是更好的描述)解决方案。我正在尝试开发一个linq语句,以便我可以解析数据集合。

我有一个匿名的数据集合,我需要能够指定两个不相关的列并组合它们的值以形成其组合值的新集合。该集合被读入IEnumerable> (结果需要相同)。

根据数据样本,要组合的列将有所不同。在方案A中(参见数据样本#1)第1列和第1列需要组合3以生成结果集(参见结果#1)。在方案B中(参见数据样本#2)第2列和第2列需要组合4以生成结果集(参见结果#2)。列标题(第一行)未提前知道,所有值都是字符串(空字符串和非空字符串)。

我希望看到以下内容:

int ColyY = 1;
int ColyX = 3;
var result = FetchMergedColumn(ColX, ColY);

数据样本#1:

Col1       Col2     Col3    Col4
Fish       Blue     Cloudy  10
Dog        Red      Rain    33
Cat        Black    Thunder 55

结果#1:

Fish    Cloudy
Dog     Rain
Cat     Thunder

数据样本#2:

Col1      Col2      Col3    Col4
Blue      Fish      10      Cloudy
Red       Dog       33      Rain
Black     Cat       55      Thunder

结果#2:

Fish    Cloudy
Dog     Rain
Cat     Thunder

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

您可以使用LINQ轻松完成此操作:

List<List<string>> SelectColumns(List<List<string>> data, params int[] columns)
{
    return data.Select(row => row.Where((_, i) => columns.Contains(i))
                                 .ToList())
               .ToList();
}

这假设您想要再次返回List<List<string>>。此外,它使用从零开始的索引,因此,为了获得结果#1,您可以这样称呼它:

var result = SelectColumns(source, 0, 2);

答案 1 :(得分:0)

请记住1.这没有参数检查或错误处理,并且2.我实际上没有运行它以查看它是否完全符合您的要求,这样的事情怎么样?

public static string[][] FetchMergedColumns(params int[] columnNumbers)
{
    var dataSample = new[]
    {
        new[] { "Fish", "Dog", "Cat" },
        new[] { "Blue", "Red", "Black" },
        new[] { "Cloudy", "Rain", "Thunder" },
        new[] { "10", "33", "55" }
    };

    return columnNumbers
        .Select(colNum => dataSample.ElementAt(colNum - 1))
        .ToArray();
}

显然你不会在方法中定义数据样本,但希望这可能会指出你正确的方向。