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

本文关键字:项目 单个 操作 索引 IGrouping | 更新日期: 2023-09-27 18:01:12

我在下面简化了逐组代码,其中我知道每个组最多存在两条记录,每个组都按照字符串数组中索引二处的值进行分组。我想遍历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);
        }
     }

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

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

听起来您所缺少的只是在组上调用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.
}

或者,您可以避免创建列表,并在组中调用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()