2012-03-06 25 views
0

我有一個對象列表FilteredItems。每個項目都有一個屬性NewFileName。我現在想要一個新的列表,這樣我就可以對每個對象都進行操作,而這些對象不是唯一的。 (我想改變這些對象的另一個屬性)如何從另一個列表中獲取重複對象的列表?

我開始編寫一個Linq查詢,我可以按它們的NewFileName對它們進行分組,但我不確定如何繼續。現在如何過濾那些組數> 1的組?

或者我在錯誤的路徑,並有一個完全不同的解決方案,以獲得沒有一個獨特的對象NewFileName

var result = from files in FilteredItems 
      group files by files.newFileName; 

foreach (var item in result) { 
    item.NewFileNameUnique = false; 
} 

回答

1

你也可以通過LinQ方法鏈實現這一點。通過'NewFileName'(GroupBy)對列表進行分組,並僅獲取那些不是唯一的(Where)以及SelectMany將其放入IEnumerable中的列表。之後循環IEnumerable並將NewFileNameUnique-property設置爲'false';

var duplicates = FilteredItems.GroupBy(i => i.NewFileName) 
           .Where(g => g.Count() > 1) 
           .SelectMany(r => r.ToList()); 

foreach(var item in duplicates) 
    item.NewFileNameUnique = false; 

希望這會有所幫助!

+0

謝謝,這正是我所需要的! – stema 2012-03-06 12:40:26

+0

很高興能幫到你! ;) – Abbas 2012-03-06 12:56:01

1

每個在你的foreach循環您的項目是FilteredItem的列表,你應該檢查這個列表大小比1或不是做大,如果是,在此列表中改變所有的值:

var result = from files in FilteredItems 
     group files by files.newFileName; 

foreach (var item in result) { 
    if (item.Count() > 1) 
    { 
     foreach(var fileDetail in item) 
      fileDetail.NewFileNameUnique = false; 
    } 
} 

最後,你可以通過修改後的值設置如下列表:

FilteredItems = result.SelectMany(x=>x).ToList(); 

編輯: 我覺得應該在這裏添加的東西,這就是LINQ是良好的搜索查詢的,但更新的東西是不好的,比如你可以簡單地通過一根處理你的問題的for循環:

for(int i=0;i<FilteredItems.Count - 1;i++) 
    for (int j=i+1;j<FilteredItems.Count;j++) 
    { 
     if (FilteredItems[i].newFileName == FilteredItems[j].newFileName) 
     { 
     FilteredItems[i].NewFileNameUnique = FilteredItems[j].NewFileNameUnique = false; 
     } 
    } 

哪個更可讀的,你也可以做到這一點,首先更快按照newFileName值對列表進行排序,然後使用下一個/ prev項目(在O(n log n)中)檢查每個項目。

+0

謝謝,你也幫我理解Linq回報的更多。我沒有對它進行基準測試,但我不認爲它是一個很好的選擇,可以使用嵌套循環來做我想做的事情。至少Abbas解決方案比嵌套循環更易於讀取和維護。 – stema 2012-03-06 12:45:51

相關問題