2017-03-29 89 views
1

我需要獲取列表中已存在的任何項目並編輯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... 

我怎樣才能得到雙重或多重記錄的索引?

+0

你已經做了什麼你問 - duplicates'的'每個產品'IGrouping',即枚舉包含共享相同的關鍵項目。 –

回答

1

可變duplicatesIGrouping可以重複。枚舉中的每個元素將是一個匿名類型,您定義爲具有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

謝謝。這是我誤解正確使用分組。 – 0perator

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); 
1

你已經擁有了正確的LINQ查詢到你想要做什麼。看起來像你的代碼更新Duplicate標誌是不正確的。您應該使用一些代碼,如下面更新杜佩標誌

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; 
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);