【问题标题】:return different lists for each key为每个键返回不同的列表
【发布时间】:2013-03-05 01:23:25
【问题描述】:

我有一个在代码中被解析为字符串 [] 列表的表格(每个字符串 [] 都是一列)。

Column1| Column2  | Column3
--------+---------+----------
0       | 1       | 8
3       | 2       | 3
5       | 2       | 8

让我们说:

string[] column1 = { 0, 3, 5 }
string[] column2 = { 1, 2, 2 };
string[] column3 = { 8, 3, 8 };
List<string[]> table = new List<string[]>() { column1, column2, column3 };

我想通过 Column3 分组选择一列(即 Column1),并在 Column3 中创建一个包含每个不同值的列表。换句话说:将 Column1 按 column3 分组,并为 Column3 的每个不同值创建一个 Column。

输出将是:

string[] result1 = { 3 };  // From column3[1] = 3
string[] result2 = { 0, 5 };  // From column3[0] = column3[2] = 8

这是postonemsdn 中的 Simple 1 的混合体。 我想用column1和column3创建一个对象,然后像这样post

Class Row { public Row(string row1, string row3); }
List<Row> rows = new List<Row>();
for(int i = 0; i < column1.Length; i++)
{ rows.Add(new Row(Column1[i], Column3[i])); }

var output = rows.GroupBy(row => row.row3).ToDictionary(grp => grp.Key, grp => grp.ToList());

但是这段代码代码有点难看。有没有类似的东西

column3.selectmany(...).GroupBy(row => row.row3).ToDictionary(grp => grp.Key, grp => grp.ToList());

我的意思是,一些表达式不需要创建一个新类并填充一个对象列表......另外,我想要作为输出

string[] result1 = { 3 };  // From column3[1] = 3
string[] result2 = { 0, 5 };  // From column3[0] = column3[2] = 8

【问题讨论】:

  • 还要注意你的问题应该问一个问题。你想知道什么?
  • 我该怎么做。创建一个新的类,一个对象列表,然后做groupby 似乎性能很差(而且代码不是很好)。我认为 selectmany 操作会比创建新类更好,但我不知道如何使用它。

标签: c# linq group-by


【解决方案1】:

您可以使用Zip 扩展方法和anonymous type 来创建行,而不是创建一个仅用于分组的新类型。

那么分组就很简单了。每个组都有一个代表 column3 的键,IGrouping 本身是一个 IEnumerable,其中包含您仅选择第 1 列的行:

var rows = column1.Zip(column3, (c1, c3) => new
{
    Column1 = c1,
    Column3 = c3
});

var output = from row in rows
             group row by row.Column3 into groupedRows
             select groupedRows.Select(r => r.Column1).ToArray();

这会产生一个IEnumerable&lt;string[]&gt;

【讨论】:

    【解决方案2】:

    pescolino 使用Zip 的回答非常好。如果您不能使用它(例如,如果您不在 .NET 4.x 上),那么您可以使用 Select 的 indexer-overload 来产生所需的结果:

    var res = col1.Select((fld,idx) => new { Field = fld, Index = idx })
              .GroupBy(entry => col3[entry.Index], entry => entry.Field)
              .Select(grp => grp.ToArray());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多