我有关于IGrouping和Select()方法的问题。
假设我以这种方式得到IEnumerable<IGrouping<int, smth>>
:
var groups = list.GroupBy(x => x.ID);
其中list是List<smth>
。
现在我需要以某种方式将每个IGrouping
的值传递给另一个列表。:
foreach (var v in structure)
{
v.ListOfSmth = groups.Select(...); // <- ???
}
在这种情况下,有人可以建议如何从List<smth>
获取值(IGrouping<int, smth>
)吗?
答案 0 :(得分:240)
自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();
答案 1 :(得分:28)
foreach (var v in structure)
{
var group = groups.Single(g => g.Key == v. ??? );
v.ListOfSmth = group.ToList();
}
首先,您需要选择所需的组。然后,您可以使用组中的ToList
方法。 IGrouping
是IEnumerable
的值。
答案 2 :(得分:13)
从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
}
答案 3 :(得分:10)
More clarified version of above answers:
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;
}
}
答案 4 :(得分:2)
var groups = list.GroupBy(x => x.ID);
在这种情况下,有人可以建议如何从IGrouping
获取值(列表)吗?
“ IGrouping
foreach (IGrouping<int, smth> group in groups)
{
var thisIsYourGroupKey = group.Key;
List<smth> list = group.ToList(); // or use directly group.foreach
}
答案 5 :(得分:0)
只需这样做:
// 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)
生成“列表列表”,有点像。
答案 6 :(得分:-1)
假设您有MyPayments类,例如
public class Mypayment
{
public int year { get; set; }
public string month { get; set; }
public string price { get; set; }
public bool ispaid { get; set; }
}
并且您有一个MyPayments列表
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();