2008-11-13 36 views
3

说一类包含<T>()和如何实现它

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

我希望能够检查,如果一个人有特定名称的联系人,而不必创建一个虚拟的Person实例。

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

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

回答

12

这可能是最容易使用Enumerable.Any

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

另外,项目,然后包含:

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

这确实是最简单的。虽然我真的很喜欢这个人.Contacts.Contains(“aPerson”);只是因为这会让我有机会将比较代码放在一个中心位置。 – 2008-11-13 15:36:34

0

您可以创建扩展方法

public static bool Contains(this IList<Person> list, string name) { 
    return list.Any(c => c.Name == name); 
} 
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"; }); 
1

我会跟Jon的Any同意,但如果你坚持用C#2.0或C#3.0。 NET 2.0/3.0并且没有LINQBridge,那么另一种方法是List<T>.FindList<T>.Exists。我会Find说明,因为Exists得到了公布,正如我正要按下按钮;-p

// C# 2.0 
bool knowsFred = person.Contacts.Find(delegate(Person x) { return x.Name == "Fred"; }) != null; 
// C# 3.0 
bool knowsFred = person.Contacts.Find(x => x.Name == "Fred") != null; 
0

已经乔恩斯基特和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); 
    } 
}