C#使用对象的属性而不是引用进行List.Contains()操作

5

我有一个类似这样的东西:

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")。不过,我认为我更喜欢The Scrum Meister的答案 :)
4个回答

9
你可以使用 Any 扩展方法:
if (myList.Any(x => x.Type == "testType"))
{
  // Do something
}

嗯嗯嗯......绝对比我的简单 ;) - IAbstract
请确保在 .cs 文件的顶部添加 using System.Linq; -- 我曾因此被绊倒了几次 :-) - Nick B
非常优雅。这绝对会被加入到我的代码片段库中。实际上,在发布问题后我意识到我的类型字符串必须在整个列表中是唯一的,所以最终我使用了 Dictionary<string, MyClass> - Ozzah

3

除了@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
}

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
}

希望这能更清楚地解释问题。


我的“Type”不是C#的类型...它是一个我从CSV文件中读取的员工类型,例如“零售”,“支持”或“账户”。我不知道这是否对你的建议有任何影响? - Ozzah
啊,我明白了。我只是更喜欢类型转换的可读性。如果你需要从字符串中获取一个类型,你可以使用 Type t = Type.GetType(String typename) - Chester Husk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接