如何从IGrouping获取值

我有一个关于IGroupingSelect()方法的问题。

让我们用这样的方式得到一个IEnumerable<IGrouping<int, smth>>:

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

其中listList<smth>

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

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

有人能建议如何在这样的上下文中从IGrouping<int, smth>中获得值(List<smth>)吗?

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

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

由于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();

下面是一个构建/运行的例子:https://dotnetfiddle.net/DyuaaP

此解决方案的视频解说:https://youtu.be/6BsU1n1KTdo

根据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
}

以上答案的更明确版本:

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;
}
}
var groups = list.GroupBy(x => x.ID);

谁能建议如何从IGrouping<int, smth>在这样的背景下?

“IGrouping< int, smth>group"实际上是一个带键的IEnumerable,所以你要么:

  • 迭代组或
  • 使用group.ToList()将其转换为List
foreach (IGrouping<int, smth> group in groups)
{
var thisIsYourGroupKey = group.Key;
List<smth> list = group.ToList();     // or use directly group.foreach
}

假设您有一个MyPayments类

 public class Mypayment
{
public int year { get; set; }
public string month { get; set; }
public string price { get; set; }
public bool ispaid { get; set; }
}

你有一个我的支付列表

public List<Mypayment> mypayments { get; set; }

你要把名单按年分组。你可以这样使用linq:

List<List<Mypayment>> mypayments = (from IGrouping<int, Mypayment> item in yearGroup
let mypayments1 = (from _payment in UserProjects.mypayments
where _payment.year == item.Key
select _payment).ToList()
select mypayments1).ToList();

简单地这样做:

// this will "split" the list into groups
var groups = list.GroupBy(x => x.ID);


// groups is a "collection of lists"
foreach (var sublist in groups)
{
// now the sublist is only a part of the original list
// to get which is the value of ID, you can use sublist.Key
}

你不需要Select().GroupBy(expr)制造“列表的列表”之类的。

如果你有一个IGrouping<GroupItem, ListItem>,并且你想访问类型为ListItem 这个群体的的项,而不使用foreach循环,这是非常简单的。类型为IGrouping<GroupItem, ListItem>的对象也是类型为IEnumerable<ListItem>的对象,因为它被定义为:

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

所以你可以简单地说:

foreach (IGrouping<GroupItem, ListItem> group in list.GroupBy(x => x.ID))
{
IEnumerable<ListItem> itemsInThisGroup = group;
// ...
}

如果由于某种原因,List<T>而不是IEnumerable<T>,当然你仍然可以调用itemsInThisGroup.ToList()。但通常情况下,如果没有必要,最好不要这样做。