2011-07-01 90 views
5

我有類似:C#使用對象的屬性,而不是參考了List.Contains()

public class MyClass 
{ 
    public string Type { get; set; } 
    public int Value { get; set; } 
} 

,然後我有:

List<MyClass> myList = new List<MyClass>() 

// ... Populate myList 

if (myList.Contains("testType")) 
{ 
    // Do something 
} 

在上面的代碼,我想myList.Contains()匹配在Type屬性而不是MyClass對象引用上。我如何實現這一目標?我是否使用IComparableICompare接口,是否覆蓋MyClass.Equals(),或者是否足以覆蓋MyClass的字符串轉換?

編輯:做與覆蓋Equals()一些測試和MyClass串投,實現ICompareIComparable後,我發現,這些方法都沒有工作。實際上,如果我要重寫字符串MyClass,就像myList.Contains((MyClass)"testType")那樣工作似乎是什麼。不過,我想我喜歡的Scrum梅斯特的回答更好:)

回答

9

可以使用Any擴展方法:

if (myList.Any(x => x.Type == "testType")) 
{ 
    // Do something 
} 
+0

hhmmm ......肯定比我更簡單;) – IAbstract

+0

附:確保你添加使用System.Linq;在.cs文件的頂部 - 這使我絆倒了幾次:-) –

+0

非常優雅。這絕對會進入我的代碼片段庫。實際上,在發佈了我的類型字符串在我的列表中必須唯一的問題後,我才意識到,所以我最終使用了「Dictionary 」。 – Ozzah

0

如果實現IEquatable<T>,你將基本覆蓋Object.Equals()方法。根據MSDN,你應該明確地重寫Object.Equals方法。然後,您可以這樣做:

void Add (MyClass testCls) 
{ 
    var myCls = myList.Where(x => x.Equals(testCls)).Select(x => x).FirstOrDefault(); 

    if (myCls == null) 
    { 
      // then myList does not contain the object you want to add 
      myList.Add(testCls); 
    } 
} 

更多關於IEquatable<T>MSDN IEquatable(T)
的優勢,這是你實際上是檢查,對其他列表內容Type屬性 - 如果這是你在找什麼做。

0

爲了澄清Scrum Meister的回答,如果我正確閱讀,您提供的條件甚至不會編譯。你看到由MyClass對象組成的列表是否包含一個字符串,所以這是行不通的。

看起來你真正想要做的是檢查並查看該列表中的MyClass對象的任何實例是否具有與所需類型匹配的Type屬性。

爲了清楚起見,不過,我會重新定義MyClass類,像這樣:

public class MyClass { 
    public Type MyType { get; set; } 
    public int Value { get; set; } 
} 

那麼你的條件是:

if(myList.Any(x => x.MyType == typeof(SomeClass)) { // put the real class name in the typeof() 
    // Do something 
} 

希望解釋的事情更清楚一點。

+0

我的「類型」不是C#類型...它是我從CSV讀取的員工類型,例如「零售」,「支持」或「賬戶」。我不知道這對你的建議有什麼影響嗎? – Ozzah

+0

啊,我明白了。我只是喜歡類型轉換的可讀性。如果你需要從字符串中獲得一個類型,你可以使用'Type t = Type.GetType(String typename)' –

3

在附加到@The Scrum的麥斯特的答案,如果你使用的是C#2.0中,你可以使用List<T>.Find

MyClass target = myList.Find(m => m.Type == "testType"); 
if (target != null) 
{ 
    // Do something to the target 
} 
相關問題