2015-06-09 16 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在他的回答中已经展示了。 –