使用具有不同类型的List<> .Contains()

时间:2012-04-07 08:30:11

标签: c#

我有一个自定义类型的通用列表

List<MyType> list = new List<MyType>();

我已经覆盖了MyType的.Equals,以便在比较字符串或MyType时它可以正常工作。我的问题是 - 如果List只包含MyType,有没有办法使用List.Contains(string)?

我意识到还有其他方法可以做到(比如在那里创建一个MyType对象而不是字符串),但有没有办法在不必扩展List的情况下进行呢?

3 个答案:

答案 0 :(得分:8)

使用linq:

bool hasSugar = list.Any(i => i.Equals("sugar"));

答案 1 :(得分:3)

Haedrian,

Linq可以为你解决这个问题吗?在我的示例中,“MyType”是一个整数列表,但我能够对字符串值执行“包含”并返回已过滤的列表。

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

List<int> list = new List<int>();

List<int> sList = (from s in list
where s.ToString().Contains("1")
select s).ToList();

我希望这有帮助。你应该搜索Linq示例,它非常强大。

答案 2 :(得分:0)

如果已实现自定义类型的接口,则包含可与自定义IEquatable一起使用。您可以为特定类型实现常见的IEquatable接口,例如。它们都有唯一 int值,可以用作id。 在这种情况下,您可以使用IEquatable,并在实现正文中:

class MyType1 : IEquatable<int>

bool IEqutabale<int>.Equals(int other)
{
    if (Id == other) return true;
    return false;
}

然后你可以比较如下:

if (Type1List.Cast<IEquatable<int>>().Contains(type2Obj.Id)
{
   //write your code here
}

您的另一个选择是在两种类型之间实现直接平等。 那就是:

class MyType1 : IEquatable<MyType2>

bool IEquatable<MyType2>.IEquals(MyType2 other)
{
     //write equality logic here
}

然后你可以比较如下:

if(Type1List.Cast<IEquatable<MyType2>>().Contains(type2Object))
{
    //write your code here
}