簡體   English   中英

C# 使用對象的屬性而不是 List.Contains() 的引用

[英]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 引用。 我如何實現這一目標? 我是否使用IComparableICompare接口,是否覆蓋MyClass.Equals() ,或者是否足以覆蓋 MyClass 的字符串轉換?

編輯:在使用覆蓋Equals()MyClass的字符串轉換、實現ICompareIComparable進行一些測試之后,我發現這些方法都不起作用。 實際上,如果我要覆蓋字符串的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM