2012-11-11 32 views
3
public class Item 
{ 
    public List<int> val { get; set; } 
    public double support { get; set; } 
} 

一個項目,我宣佈變量:檢查清單<T>元素包含一個特定屬性值

List<Item> t = new List<Item>(); 
t.Add(new Item(){val = new List<int>(){1,2,3};support=.1); 
var b = new Item(); 
b.val = t[0].val; 
b.support=t[0].support; 
t.Contain(b) // return false??? 

我嘗試使用LINQ

t.Any(a=>a.val==b.val) // I'm get error Expression cannot contain lambda expressions 

對不起,我的英語

回答

2

3的可能性浮現在腦海中:

您可以實現IEquatable<T>

public class Item: IEquatable<Item> 
{ 
    public List<int> val { get; set; } 
    public double support { get; set; } 

    public bool Equals(Item other) 
    { 
     return 
      this.support == other.support && 
      this.val.SequenceEqual(other.val); 
    } 
} 

現在t.Contains(b)將返回true。


如果您不能修改Item類,你可以寫一個自定義的EqualityComparer

public class ItemEqualityComparer : IEqualityComparer<Item> 
{ 
    private ItemEqualityComparer() 
    { 
    } 

    public static IEqualityComparer<Item> Instance 
    { 
     get 
     { 
      return new ItemEqualityComparer(); 
     } 
    } 

    public bool Equals(Item x, Item y) 
    { 
     return 
      x.support == y.support && 
      x.val.SequenceEqual(y.val); 
    } 

    public int GetHashCode(Item obj) 
    { 
     int hash = 27; 
     hash += (13 * hash) + obj.support.GetHashCode(); 
     foreach (var item in obj.val) 
     { 
      hash += (13 * hash) + item.GetHashCode(); 
     } 
     return hash; 
    } 
} 

然後t.Contains(b)也將返回true


或者如果你喜歡簡單地做它天真地:

List<Item> t = new List<Item>(); 
t.Add(new Item { val = new List<int>(){1,2,3}, support=.1 }); 

var b = new Item(); 
b.val = t[0].val; 
b.support = t[0].support; 

bool equals = t.All(item => item.support == b.support && item.val.SequenceEqual(b.val)); 
Console.WriteLine(equals);   
+0

TKS,它幫助我。你可以解釋爲什麼t.Any(a => a.val == b.val)//我得到錯誤表達式不能包含lambda表達式 – NamPNQ

+0

你不應該得到這個錯誤。我不確定爲什麼會發生這種情況,因爲您在問題中提供的代碼示例是無效的C#並且不能編譯。例如你的對象初始化器是錯誤的。你有一個缺少的關閉'}',並使用';'而不是'''來分隔proeprty名稱。 –

+0

噢,這段代碼是示例,我混淆','到';',在窗口中觀看(調試)我得到錯誤表達式不能包含t.Any的lambda表達式(a => a.val == b.val) 。對不起我的英語不好 – NamPNQ

1

您的t.Any(a=>a.val == b.val)是正確的。

您得到的錯誤來自調試器中的快速監視或表達式窗口,而不是來自編譯器。 Visual Studio的表達式計算器不處理lambdas。然而,它仍然是有效的C#代碼,並會做你想做的。

1

這是你前面行,這是一個問題:

t.Add(new Item(){val = new List<int>(){1,2,3};support=.1); 

這是語法的各種不同位的混合物。它應該是:

t.Add(new Item(){val = new List<int>(){1,2,3}, support=.1}); 

...雖然最好用更好的屬性名稱等,然後其餘的應該工作 - 儘管你需要做一些事情的Any結果。調用本身是有效的。下面是其工作的一個簡短但完整的程序:

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Item 
{ 
    public List<int> Values { get; set; } 
    public double Support { get; set; } 
} 

class Test 
{ 
    static void Main() 
    { 
     List<Item> list = new List<Item> 
     { 
      new Item { Values = new List<int>{1, 2, 3}, 
         Support = 0.1 } 
     }; 

     var check = new Item { Values = list[0].Values, 
           Support = list[0].Support }; 

     bool found = list.Any(a => a.Values == check.Values); 
     Console.WriteLine(found); 
    } 
} 

注意,這是在執行這兩個列表之間的參考比較 - 如果你創建了一個不同的列表有相同的值(1,2,3),即將不會被發現。你需要使用a.Values.SequenceEqual(b.Values)或類似的東西。

0

Item類應該implemenet的IEquatable接口:

class Item : IEquatable<Item>{ 
    public List<int> val { get; set; } 
    public double support { get; set; } 

    public bool Equals(Item item){ 
     return this.support.Equals(item.support) && this.val.SequenceEqual(item.val);   
    } 
} 

然後Contains()方法應該很好地工作。

0

您可以糾正你的
t.Contain(b)」 從System.Linq


t.Contains(b, new ItemEqualityComparer())其中ItemEqualityComparer將是你的類,這將實現IEqualityComparer<Item>

相關問題