我正在尝试按名称对对象集合进行分组,但是我还想在每个组中设置一个顺序的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应用了一些投影,但是我不知道如何在SelectSelectMany中使用累加器或索引。

我不想创建新的集合,而只修改现有的集合,在每个元素上设置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));

09-13 07:45