Person
+Name: string
+Contacts: List<Person>
我希望能够检查,如果一个人有特定名称的联系人,而不必创建一个虚拟的Person实例。
person.Contacts.Contains<string>("aPersonName");
这应该检查联系人列表中的所有人,如果他们的Name.Equals(“aPersonName”); 我看到有一个Contains已经可用,但我不知道应该在哪里实现它的逻辑。
Person
+Name: string
+Contacts: List<Person>
我希望能够检查,如果一个人有特定名称的联系人,而不必创建一个虚拟的Person实例。
person.Contacts.Contains<string>("aPersonName");
这应该检查联系人列表中的所有人,如果他们的Name.Equals(“aPersonName”); 我看到有一个Contains已经可用,但我不知道应该在哪里实现它的逻辑。
这可能是最容易使用Enumerable.Any:
return person.Contacts.Any(person => person.Name=="aPersonName");
另外,项目,然后包含:
return person.Select(person => person.Name).Contains("aPersonName");
您可以创建扩展方法
public static bool Contains(this IList<Person> list, string name) {
return list.Any(c => c.Name == name);
}
我假设联系人是有问题的人员的联系人(代码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"; });
我会跟Jon的Any
同意,但如果你坚持用C#2.0或C#3.0。 NET 2.0/3.0并且没有LINQBridge,那么另一种方法是List<T>.Find
或List<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;
已经乔恩斯基特和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);
}
}
这确实是最简单的。虽然我真的很喜欢这个人.Contacts.Contains(“aPerson”);只是因为这会让我有机会将比较代码放在一个中心位置。 – 2008-11-13 15:36:34