包含<t>()以及如何实现它</t>

时间:2008-11-13 15:07:42

标签: c# linq

说一个课

Person  
+Name: string  
+Contacts: List<Person>

我希望能够检查一个人是否有某个名称的联系人而无需创建一个虚拟Person实例。

person.Contacts.Contains<string>("aPersonName");

这应该检查联系人列表中的所有人是否有他们的Name.Equals(“aPersonName”); 我看到有一个Contains已经可用,但我不知道我应该在哪里实现它的逻辑。

5 个答案:

答案 0 :(得分:12)

使用Enumerable.Any可能最简单:

 return person.Contacts.Any(person => person.Name=="aPersonName");

或者,项目然后包含:

 return person.Select(person => person.Name).Contains("aPersonName");

答案 1 :(得分:2)

我假设联系人是相关人员的联系人(代码snippit中的人)

List有一个contains方法,它将类型为T的对象作为参数,如果该对象存在于列表中,则返回true或false。你想要的是IList.Exists方法,它采用谓词。

示例(c#3.0)

bool hasContact = person.Contacts.Exists(p => p.Name == "aPersonName");

或(c#2.0)

bool hasContact = person.Contacts.Exists(delegate(Person p){ return p.Name == "aPersonName"; });

答案 2 :(得分:1)

我同意Jon的Any,但是如果你坚持使用C#2.0,或者使用.NET 2.0 / 3.0而没有LINQBridge的C#3.0,那么另一种方法是List<T>.Find或{{1 }}。我会用List<T>.Exists进行说明,因为Find就像我正要按下按钮一样张贴;-p

Exists

答案 3 :(得分:0)

您可以创建扩展方法

public static bool Contains(this IList<Person> list, string name) {
    return list.Any(c => c.Name == name);
}

答案 4 :(得分:0)

Jon Skeet和yapiskan已经提出的解决方案是可行的方法。如果您确切需要您所说的内容,那么您可以编写扩展方法:

public static class ContactListExtensions
{
    public static bool Contains<T>(this List<Person> contacts, string aPersonName)
    {
        //Then use any of the already suggested solutions like:
        return contacts.Contains(c => c.Name == aPersonName);
    }
}