如何在IGrouping中对组中索引处的单个项目进行操作?

kmk*_*09k 0 c# linq

我在下面简化了 groupby 代码,我知道每个组最多存在两条记录,每个组按字符串数组中索引二处的值分组。我想遍历 IGrouping 中的键列表,并在每个组中组合一些值,然后将该结果添加到最终列表中,但我是 LINQ 的新手,所以不完全知道如何访问这些第一个和/或第二个索引处的值。

谁能解释一下如何做到这一点?

从 var 行派生的每个 Group 是这样的:

 key    string[]
----   ------------- 
123    A, stuff, stuff
123    B, stuff, stuff
Run Code Online (Sandbox Code Playgroud)

我希望结果是一个 string[] ,它组合了“最终”列表中每个组的元素,例如:

string[]
-------
A, B
Run Code Online (Sandbox Code Playgroud)

我的代码:

     var lines = File.ReadAllLines(@path).Skip(1).Select(r => r.Split('\t')).ToList();
     List<string[]> final = new List<string[]>();
     var groups = lines.GroupBy(r => r[2]);

     foreach (var pairs in groups)
     {
        // I need to combine items in each group here; maybe a for() statement would be better so I can peek ahead??
        foreach (string[] item in pairs)
        {
           string[] s = new string[] { };
           s[0] = item[0];
           s[1] = second item in group - not sure what to do here or if I am going aboout this the right way

           final.Add(s);
        }
     }
Run Code Online (Sandbox Code Playgroud)

在这个主题上也没有太多的支持,所以我认为它可能对某人有帮助。

Jon*_*eet 5

听起来您缺少的只是打电话ToListToArray加入群组:

foreach (var group in groups)
{
    List<string[]> pairs = group.ToList();
    // Now you can access pairs[0] for the first item in the group,
    // pairs[1] for the second item, pairs.Count to check how many
    // items there are, or whatever.
}
Run Code Online (Sandbox Code Playgroud)

或者你可以避开创建列表和呼叫Count()ElementAt()ElementAtOrDefault()等的组。

现在,取决于您在嵌套foreach循环体中实际执行的操作(不清楚,并且到目前为止您提供的代码将不起作用,因为您试图将一个值分配给一个空数组),您可能能够逃脱:

var final = lines.GroupBy(r => r[2])
                 .Select(g => ...)
                 .ToList()
Run Code Online (Sandbox Code Playgroud)

哪里...是“无论你想对一个小组做什么”。如果你可以这样做,它会使代码更清晰。

随着问题中的更多信息,您似乎只想要:

var final = lines.GroupBy(r => r[2])
                 .Select(g => g.Select(array => array[0]).ToArray())
                 .ToList()
Run Code Online (Sandbox Code Playgroud)