C# 包含<;T>;()以及如何实施
说课C# 包含<;T>;()以及如何实施,c#,linq,C#,Linq,说课 Person +Name: string +Contacts: List<Person> 人 +名称:string +联系人:列表 我希望能够检查一个人是否与某个名字有联系,而不必创建一个虚拟的person实例 person.Contacts.Contains<string>("aPersonName"); person.Contacts.Contains(“aPersonName”); 这应该检查联系人列表中的所有人的姓名是否等于(“个人姓名”);
Person
+Name: string
+Contacts: List<Person>
人
+名称:string
+联系人:列表
我希望能够检查一个人是否与某个名字有联系,而不必创建一个虚拟的person实例
person.Contacts.Contains<string>("aPersonName");
person.Contacts.Contains(“aPersonName”);
这应该检查联系人列表中的所有人的姓名是否等于(“个人姓名”);
我看到已经有一个Contains可用,但我不知道应该在哪里实现它的逻辑。它可能是最容易使用的: 或者,创建项目,然后包含:
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);
}
公共静态bool包含(此IList列表,字符串名称){
返回列表.Any(c=>c.Name==Name);
}
我假设联系人是相关人员的联系人(您代码中的人员snippit)
List有一个contains方法,该方法将T类型的对象作为参数,如果该对象存在于列表中,则返回true或false。您需要的是IList.Exists方法,它接受一个谓词
示例(c#3.0)
或(c#2.0)
我同意Jon的
Any
,但是如果你坚持使用C 2.0,或者C 3.0和.NET 2.0/3.0,并且没有LINQBridge,那么另一种方法是List.Find
或者List.Exists
。我将用Find
来说明,因为存在
就在我正要按下按钮时发布了-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;
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);
}
}
公共静态类ContactListExtensions
{
公共静态bool包含(此列表联系人,字符串aPersonName)
{
//然后使用任何已建议的解决方案,如:
返回contacts.Contains(c=>c.Name==aPersonName);
}
}
这确实是最简单的。虽然我真的很喜欢person.Contacts.Contains(“aPerson”);因为这会让我有机会将比较代码放在一个中心位置。将代码放在一个扩展方法中,就像我在另一个问题中建议的那样,将启用person.Contacts.Contains(“aPerson”)语法。我个人会编写一个稍微不同的扩展方法,以允许person.Contacts.Contains(p=>p.Name,“aPerson”)。这让事情变得非常明显。它在我的“增强LINQ对象”列表中。。。
bool hasContact = person.Contacts.Exists(delegate(Person p){ return p.Name == "aPersonName"; });
// 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;
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);
}
}