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);
    }
}