2012-11-21 97 views
8

我只是試圖返回如果列表中包含任何從列表2名稱/值的真實任何元素:檢查一個列表包含從另一個

這將是我的結構:

public class TStockFilterAttributes 
{ 
    public String Name { get; set; } 
    public String Value { get; set; } 
} 

List<TStockFilterAttributes> List1 = new List<TStockFilterAttributes>(); 
List<TStockFilterAttributes> List2 = new List<TStockFilterAttributes>(); 

這應該返回true:

List1.Add(new TStockFilterAttributes { Name = "Foo", Value = "Bar" }); 
List2.Add(new TStockFilterAttributes { Name = "Foo", Value = "Bar" }); 

但是,這將返回false,因爲名稱& &值不匹配:

List1.Add(new TStockFilterAttributes { Name = "Foo", Value = "Bar" }); 
List2.Add(new TStockFilterAttributes { Name = "Foo", Value = "Foo" }); 

每個列表可能包含很多不同的值,我只需要知道List1中的任何一個是否與List2中的任何一個匹配。

我已經嘗試使用:

return List1.Intersect(List2).Any(); 

但這似乎在所有情況下返回false,我假定這是因爲我在列表保持一類,而不是一個簡單的INT /字符串?

+6

'Intersect'工作在默認情況下引用,因爲你創建新的對象,每次,你必須寫自己['的IEqualityComparer '](http://msdn.microsoft.com /en-us/library/ms132151.aspx) –

回答

7

覆蓋EqualsGetHashCode實施類:

public class TStockFilterAttributes 
{ 
    public String Name { get; set; } 
    public String Value { get; set; } 

    public override bool Equals(object obj) 
    { 
     TStockFilterAttributes other = obj as TStockFilterAttributes; 
     if (obj == null) 
      return false; 

     return Name == obj.Name && Value == obj.Value; 
    } 

    public override int GetHashCode() 
    { 
     return Name.GetHashCode()^Value.GetHashCode(); 
    } 
} 

,或者提供一個比較器對Intersect功能。

+0

我在這裏發佈問題後就試過了,它工作。當我被允許時,我會將其標記爲答案,因爲它與我的解決方案相同。謝謝。 – webnoob

+0

@webnoob歡迎您。問題在於缺省的'Equals'和'GetHashCode'實現,它們使用對象引用來比較不同的對象。 Linq使用這些方法進行比較。 –

5

假設性能並不重要:

List1.Any(l1 => List2.Any(l2 => l1.Key == l2.Key && l1.Value == l2.Value)); 

替代將重載Equals或使之成爲結構(可能不恰當)

+2

性能總是很重要;) – webnoob

1

這裏的問題是,你是比較參考,不對象。由於每次都創建一個新對象,因此這些列表永遠不會保存相同的引用。

嘗試:

var FooBar = new TStockFilterAttributes { Name = "Foo", Value = "Bar" }; 
var FooFoo = new TStockFilterAttributes { Name = "Foo", Value = "Foo" }; 
List1.Add(FooBar); 
List2.Add(FooBar); 
List2.Add(FooFoo); 
return List1.Intersect(List2); 
+0

這就是我認爲的問題,我現在已經實現了一個IEqualityComparer來排序問題。 – webnoob

+0

絕對如此。根據您的需要,您有兩種方法。通常情況下,我們希望檢查參考,但有時您只需比較這些值。 – Pete

3
var query = List1.Where(x => List2.Exists(y => y.Name == x.Name && y.Value == x.Value)); 

但性能可能會壞

0

末顛簸,但僅相交,我們可以使用選擇,避免使用平等。

list1.Select(Function(p) p.ItemID).Intersect(list2.Select(Function(p)p.ItemID)).Any() 
相關問題