我在下面简化了groupby代码,我知道每组最多有两条记录,每组按照字符串数组中索引2的值进行分组。我想迭代IGrouping中的键列表,并在每个Group中组合一些值,然后将结果添加到最终列表,但我是LINQ的新手,所以不知道如何首先访问这些和/或第二个索引处的值。
有人能说清楚如何做到这一点吗?
从var行派生的每个组都是这样的:
key string[]
---- -------------
123 A, stuff, stuff
123 B, stuff, stuff
我希望结果是一个字符串[],它将“最终”列表中每个组的元素组合在一起,如:
string[]
-------
A, B
我的代码:
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);
}
}
对这个问题也没有太多的支持,所以我认为它对某些人可能有所帮助。
答案 0 :(得分:4)
听起来你错过的就是在小组中呼叫ToList
或ToArray
:
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.
}
或者您可以避免创建列表,并在群组中调用Count()
,ElementAt()
,ElementAtOrDefault()
等。
现在取决于你在嵌套foreach
循环体内实际做了什么(目前还不清楚,你到目前为止所提供的代码无法正常工作,因为你试图分配一个你可以逃脱:
var final = lines.GroupBy(r => r[2])
.Select(g => ...)
.ToList()
其中...
是“你想对群组做什么”。如果你可以这样做,它会使代码更加清晰。
在问题中有更多信息,看起来你只想:
var final = lines.GroupBy(r => r[2])
.Select(g => g.Select(array => array[0]).ToArray())
.ToList()