如何从IGrouping获取值


211

IGroupingSelect()方法有疑问。

假设我有IEnumerable<IGrouping<int, smth>>这样一种方式:

var groups = list.GroupBy(x => x.ID);

哪里listList<smth>

现在,我需要以IGrouping某种方式将每个值传递给另一个列表:

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}

在这种情况下,有人可以建议如何从中获取值(List<smth>IGrouping<int, smth>吗?


ID通常是一个标识字段,应该是唯一的,这会使按它进行分组变得无用,如果您只是想删除重复的数据,请尝试使用Distinct()。如果它是list.GroupBy(x => x.SubID),则使用分组是有意义的,但是在这种情况下,您很可能希望保留分组和foreach(var grp in groups){grp.ToList() ; }将会这样做
MikeT

Answers:


277

由于IGrouping<TKey, TElement>工具IEnumerable<TElement>,你可以用SelectMany把所有的IEnumerables回一个IEnumerable一起:

List<smth> list = new List<smth>();
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id);
IEnumerable<smth> smths = groups.SelectMany(group => group);
List<smth> newList = smths.ToList();

3
这与普通的“ orderBy”不一样吗?List <smth> newList = list .OrderBy(x => x.id).ToList();
MorgoZ '16

@MorgoZ,问题是关于将groups并返回到固定列表。
马特·史密斯

3
@MorgoZ,OrderBy(x => x.id)将按ID升序对它们进行排序。将此与进行对比.GroupBy(x => x.id).SelectMany(group => group),它将按照ID的首次出现顺序对其进行排序。如果原始ID的顺序为:[1,3,2,2,2,3,0],则将它们分组,然后展平到一个列表中,则ID会以新的顺序排列:[1,3,3, 2,2,2,0]。
Pi Fisher

2
它对我不起作用..它说,该类型不能由使用情况推断出来
Revious

3
类型不能通过用法来推断
Leo Gurdian

34
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

首先,您需要选择所需的组。然后,您可以ToList在组上使用方法。该IGroupingIEnumerable值的。


17

以上答案的更清晰版本:

IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA);

foreach (var groupingByClassA in groups)
{
    int propertyIntOfClassA = groupingByClassA.Key;

    //iterating through values
    foreach (var classA in groupingByClassA)
    {
        int key = classA.PropertyIntOfClassA;
    }
}

我不这么认为,至少目前是这样。
snr

15

从IGrouping的定义:

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable

您可以通过以下元素进行迭代:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID)
foreach(IEnumerable<smth> element in groups)
{
//do something
}

1
通过组而不是组中的项进行迭代
MikeT

1
哦,我的错,那就是:'foreach(smth p in groups.SelectMany(sth => sth))'
user1275513 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.