[英]C# Use object's property rather than reference for 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 object 引用。 我如何實現這一目標? 我是否使用IComparable
或ICompare
接口,是否覆蓋MyClass.Equals()
,或者是否足以覆蓋 MyClass 的字符串轉換?
編輯:在使用覆蓋Equals()
和MyClass
的字符串轉換、實現ICompare
和IComparable
進行一些測試之后,我發現這些方法都不起作用。 實際上,如果我要覆蓋字符串的MyClass
強制轉換,似乎會起作用,例如myList.Contains((MyClass)"testType")
。 但是我認為我更喜歡 Scrum Meister 的回答:)
您可以使用Any
擴展方法:
if (myList.Any(x => x.Type == "testType"))
{
// Do something
}
除了@The Scrum Meister 的回答,如果您使用的是 C#2.0,您可以使用List<T>.Find
MyClass target = myList.Find(m => m.Type == "testType");
if (target != null)
{
// Do something to the target
}
如果你實現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
屬性 - 如果這是您想要做的。
為了澄清 Scrum Meister 的回答,如果我正確閱讀,您提供的條件甚至不會編譯。 您正在查看由 MyClass 對象組成的列表是否包含字符串,因此這不起作用。
看起來您真正想要做的是檢查並查看該列表中的 MyClass object 的任何實例是否具有與您所需類型匹配的 Type 屬性。
不過,為了清楚起見,我會像這樣重新定義 MyClass class :
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
}
希望能更清楚地解釋事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.