我正在尝试按名称对对象集合进行分组,但是我还想在每个组中设置一个顺序的InstanceID属性,这样我就有以下内容:
Name="A", InstanceID=0
Name="A", InstanceID=1
Name="A", InstanceID=2
Name="B", InstanceID=0
Name="C", InstanceID=0
Name="C", InstanceID=1
Name="C", InstanceID=2
Name="D", InstanceID=0
Name="D", InstanceID=1
Name="D", InstanceID=2
Name="D", InstanceID=3
等等
我假设在
GroupBy
之后通过LINQ应用了一些投影,但是我不知道如何在Select
或SelectMany
中使用累加器或索引。我不想创建新的集合,而只修改现有的集合,在每个元素上设置
InstanceID
。 最佳答案
您可以按GroupBy
Name
,然后为每个组设置InstanceID
属性:
var groups = objects.GroupBy(m => m.Name);
foreach (var group in groups)
{
int index = 0;
foreach (var item in group)
item.InstanceID = index++;
}
编辑:
您可以创建扩展方法
ForEach
来接收项目和索引:static class Extensions
{
public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
{
foreach (var item in collection)
action(item);
}
public static void ForEach<T>(this IEnumerable<T> collection, Action<T, int> action)
{
int index = 0;
foreach (var item in collection)
action(item, index++);
}
}
并像这样使用它:
var groups = objects.GroupBy(m => m.Name);
groups.ForEach(g => g.ForEach((o, i) => o.InstanceID = i));