2015-06-09 14 views
1

請原諒我的混淆標題。但我不能想出更簡單的東西。LINQ除/僅基於幾列,不添加重複

我已經下課了。

public class Foo 
{ 
    public FooId int { get; set; } 

    public FooField string { get; set; } 

    //some more fields here.... 
    //.... 
    //.... 

    public DateTime CreatedDate { get; set; } 
} 

我需要遍歷的東西,並添加了一系列FooList<Foo>,但它不應該被重複的基礎上,FooIdFooField組合。

所以我想,如下

List<Foo> foos = new List<Foo>(); 

foreach (Bar item in blah.Bars) 
{ 
    //Some code here to get the foos from the item 
    List<Foo> processedFoos = item.GetFoos(); 

    //The problem is with below line 
    foos.AddRange(processedFoos.Except(foos)); 
} 

Except增加了所有記錄,並複製了FooIdFooField組合CreatedDate將是所有獨特記錄。

但我需要忽略CreatedDate,只是添加那些不違反獨特組合的記錄。

我能在這裏做什麼? ExceptDistinct?任何其他的選擇?

最重要的是,如何?

+1

實施'的IEqualityComparer '和使用的適當的過載的'除()'的https:// MSDN ()。Select()().microsoft.com/zh-cn/usr/vstudio/bb336390(v = vs.100).aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-1 – Ric

回答

7

要麼你需要重寫EqualsFoo,或實施IEqualityComparer<Foo>使Except可以告訴兩個Foo值是否相等。例如:

public sealed class FooComparer : IEqualityComparer<Foo> 
{ 
    public bool Equals(Foo x, Foo y) 
    { 
     return x.FooId == y.FooId && x.FooField == y.FooField; 
    } 

    public int GetHashCode(Foo foo) 
    { 
     // Note that if FooField can be null, you'll need to account for that... 
     return foo.FooId^foo.FooField.GetHashCode(); 
    } 
} 

然後:

foos.AddRange(processedFoos.Except(foos, new FooComparer())); 
1

ExceptDistinct都將根據對象的Equals實現(這是默認的相等比較器)比較項目。他們也都有過載,採取IEqualityComparer<T>

您可以實現此接口(見the documentation爲例)比較只有你所需要的領域,並把它傳遞給Except

foos.AddRange(processedFoos.Except(foos, comparer)); 
0

我想你應該改變你的選擇不重複記錄的方式:

processedFoos.Where(x => !foos.Any(y => y.FooId == x.FooId && y.FooField == x.FooField)) 
1

ExceptDistinct都有過載,它接受一個IEqualityComparer。你可以實現一個只比較你需要的屬性。

另一種方法是按FooId和FooField並從每個組採取的第一個元素:

processFoos.GroupBy(foo => new {foo.FooId, foo.FooField}) 
.Select(g => g.First()); 
+0

'GroupBy '方法很好,但基於獨特的組合,它得到了獨特的'processedFoos'。我需要檢查'processedFoos'中的重複項,這些重複項在'foos'中已經不存在。謝謝您的回答。不勝感激!我將實施'IEqualityComparer',就像你和其他人建議的那樣@Jon Skeet在他的回答中已經展示了。 –