1

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

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

我已经覆盖了 MyType 的 .Equals ,因此如果您将字符串或 MyType 与它进行比较,它就可以工作。我的问题是 - 如果 List 只包含 MyType,有没有办法使用 List.Contains(string)?

我意识到还有其他方法可以做到这一点(例如在那里创建一个 MyType 对象,然后代替字符串),但是有没有一种方法可以在不必扩展 List 的情况下做到这一点?

4

3 回答 3

8

使用 linq:

bool hasSugar = list.Any(i => i.Equals("sugar"));
于 2012-04-07T08:33:41.343 回答
3

海德良,

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 示例,它非常强大。

于 2012-04-07T09:33:23.470 回答
0

如果您已经为您的自定义类型实现了接口,那么 Contains 可以与自定义 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
}
于 2016-11-30T10:38:05.767 回答