在列表和编辑项中获取重复项

时间:2017-03-29 19:44:42

标签: c# .net arrays winforms list

我需要获取已存在的列表中的任何项目并编辑 BOTH 项目以包含重复的属性。

我试图通过以下方式获得重复:

var duplicates = LIST.Select((t, i) => new { Index = i, Text = t }).GroupBy(g => g.Text.PROPERTYTOSEARCGBY).Where(g => g.Count() > 1);

然而,当我需要获取两个记录的索引以便我可以使用以下命令编辑它时,这会返回重复的属性:

LIST[index1].FlaggedData = true;
LIST[index2].FlaggedData = true;
etc...

如何获取BOTH重复或多条记录的索引?

4 个答案:

答案 0 :(得分:1)

变量duplicates是可以迭代的IGrouping。枚举中的每个元素都是您定义为具有2个属性的匿名类型:IndexText

foreach (var grouping in duplicates)
{
    // This will contain the value that was grouped by:
    // - grouping.Key

    foreach (var pair in grouping)
    {
        // These properties are available
        //  - pair.Index
        //  - pair.Text

        // set the FlaggedData property
        pair.Text.FlaggedData = true;
    }
}

答案 1 :(得分:1)

您已经拥有正确的LINQ查询来执行您想要的操作。似乎更新Duplicate标志的代码不正确。您应该使用下面的代码来更新Dupe标志

foreach (var group in duplicates) {
    foreach (var item in group) {
        LIST[item.Index].FlaggedData = true;
    }
}

或更简洁的代码,如

foreach (var item in duplicates.SelectMany(item => item))
    item.Text.FlaggedData = true;

答案 2 :(得分:0)

使用SelectMany

duplicates = LIST.Select((t, i) => new { Index = i, Text = t })
.GroupBy(g => g.Text.PROPERTYTOSEARCGBY)
.Where(g => g.Count() > 1)
.SelectMany(g => g, (g, x) => x.Index);

答案 3 :(得分:0)

您不需要索引。 它足以像您一样进行分组并自行选择项目。

var duplicates = LIST.GroupBy(t => t.PROPERTYTOSEARCGBY)
                     .Where(g => g.Count() > 1)
                     .SelectMany(t=>t);

foreach (var item in duplicates)
{
    item.FlaggedData = true;
}

甚至更短:

LIST.GroupBy(t => t.PROPERTYTOSEARCGBY)
    .Where(g => g.Count() > 1)
    .SelectMany(t=>t)
    .ToList()
    .ForEach(t=>t.FlaggedData = true);