Скажите класс
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");
Помещение кода в метод расширения, как я предложил в другом вопросе, включит синтаксис person.Contacts.Contains ("aPerson").
Лично я бы написал немного другой метод расширения, чтобы разрешить person.Contacts.Contains (p => p.Name, "aPerson"). Это делает действительно очевидным, что происходит. Это в моем списке для «улучшенного LINQ to objects» ...
Вы можете создать метод расширения
public static bool Contains(this IList<Person> list, string name) {
return list.Any(c => c.Name == name);
}
Я предполагаю, что Контакты - это Контакты для рассматриваемого человека (человек в вашем фрагменте кода)
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"; });
Я согласен с 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);
}
}
Это действительно самый простой способ. Хотя мне бы очень понравился person.Contacts.Contains ("aPerson"); Просто потому, что это дало бы мне возможность поместить код сравнения в центральное место.