Contains<T>()及其实现方法

3
说一个类
Person  
+Name: string  
+Contacts: List<Person>

我希望能够在不创建虚拟人物实例的情况下检查一个人是否与某个特定名称的联系人有联系。

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

这段代码应该检查联系人列表中所有人的姓名是否等于“aPersonName”; 我看到已经有一个Contains方法了,但我不知道在哪里实现它的逻辑。

5个回答

12

使用Enumerable.Any可能是最简单的方法:

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

或者,进行项目,然后包含:

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

这确实是最简单的方法。虽然我真的很想用Contacts.Contains("aPerson"),因为这会让我有机会将比较代码放在一个中央位置。 - Boris Callens
将代码放在扩展方法中,就像我在另一个问题中建议的那样,可以启用person.Contacts.Contains("aPerson")语法。 - configurator
我个人会编写稍微不同的扩展方法,以允许 person.Contacts.Contains(p => p.Name, "aPerson") 这种写法。这样可以更明显地表达代码意图。这个功能已经在我改进的 LINQ to objects 列表中了... - Jon Skeet

2

我假设“Contacts”是指涉及到的人员的联系方式(在你的代码片段中)。

List有一个包含方法,它以类型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
你可以创建扩展方法。
public static bool Contains(this IList<Person> list, string name) {
    return list.Any(c => c.Name == name);
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接