2009-02-02 4 views
13

Если у вас есть список, как вы возвращаете элемент, если указанное свойство или коллекция свойств существует?List.Contains (item) с общим списком объектов

public class Testing 
{ 
    public string value1 { get; set; } 
    public string value2 { get; set; } 
    public int value3 { get; set; } 
} 
public class TestingList 
{ 
    public void TestingNewList() 
    { 
     var testList = new List<Testing> 
          { 
           new Testing {value1 = "Value1 - 1", value2 = "Value2 - 1", value3 = 3}, 
           new Testing {value1 = "Value1 - 2", value2 = "Value2 - 2", value3 = 2}, 
           new Testing {value1 = "Value1 - 3", value2 = "Value2 - 3", value3 = 3}, 
           new Testing {value1 = "Value1 - 4", value2 = "Value2 - 4", value3 = 4}, 
           new Testing {value1 = "Value1 - 5", value2 = "Value2 - 5", value3 = 5}, 
           new Testing {value1 = "Value1 - 6", value2 = "Value2 - 6", value3 = 6}, 
           new Testing {value1 = "Value1 - 7", value2 = "Value2 - 7", value3 = 7} 
          }; 

     //use testList.Contains to see if value3 = 3 
     //use testList.Contains to see if value3 = 2 and value1 = "Value1 - 2" 


    } 
} 

ответ

23

Если вы используете .NET 3.5 или лучше, LINQ является ответом на этот:

testList.Where(t => t.value3 == 3); 
testList.Where(t => t.value3 == 2 && t.value1 == "Value1 - 2"); 

Если вы не используете .NET 3.5, то вы можете просто перебрать и выбрать те, вы хотите.

+0

Зачем требовать импорт LINQ, если Find, FindAll и Exists уже определены для списка? – bdukes

+0

@bdukes Комментарий ответа Necro, просто не заметил его раньше :) Найти в версиях до 3.5 использовал оператор равенства объектов для определения равенства. Вы можете поставить свои собственные, но до 3,5 это было больно. Но с 3.5 они добавили лямбда-версию, где вы можете определить равенство по мере необходимости. Я сказал LINQ, потому что это было первое, что я думал о том, что соответствует его запросу, но я думаю, что вы правы, если у вас уже есть List, вы должны использовать встроенные операторы. Если у него есть что-то еще, у которого их нет, LINQ будет соответствовать счету. – CubanX

+0

Да, есть и другие способы. Но +1 для напоминания мне, что я могу использовать: 'SiteList.Where (s => s.GLCode == glcode);' в моем коде. :-) – cbmeeks

26

Вы можете использовать

testList.Exists(x=>x.value3 == 3) 
+0

+1 для удобства и спасибо помощнику –

+0

+1 снова для удобства использования. Также http://stackoverflow.com/questions/1938204/linq-where-vs-findall – ruffrey

7

Если вы хотите использовать реализацию этого класса, равенства, вы можете использовать метод Contains. В зависимости от того, как вы определяете равенство (по умолчанию он будет ссылочным, что не будет никакой помощью), вы можете запустить один из этих тестов. Вы также можете создать несколько IEqualityComparer<T> с для каждого теста, который вы хотите выполнить.

В качестве альтернативы для тестов, которые не полагаются только на равенство класса, вы можете использовать метод Exists и передать делегат для проверки на (или Find, если вы хотите получить ссылку на соответствующий экземпляр).

Например, вы могли бы определить равенство в Testing класс следующим образом:

public class Testing: IEquatable<Testing> 
{ 
    // getters, setters, other code 
    ... 

    public bool Equals(Testing other) 
    { 
     return other != null && other.value3 == this.value3; 
    } 
} 

Тогда вы бы проверить, если список содержит элемент с value3 == 3 с этим кодом:

Testing testValue = new Testing(); 
testValue.value3 = 3; 
return testList.Contains(testValue); 

Чтобы использовать Exists, вы можете сделать следующее (первый делегатом, второй с лямбда):

return testList.Exists(delegate(testValue) { return testValue.value3 == 3 }); 

return testList.Exists(testValue => testValue.value3 == 2 && testValue.value1 == "Value1 - 2"); 
1

Запрос LINQ, вероятно, будет самым простым способом кодирования этого.

Testing result = (from t in testList where t.value3 == 3 select t).FirstOrDefault(); 
+0

В C# вам понадобится предложение select в выражении запроса. В этом случае проще использовать метод Where, IMO. –

+0

К сожалению. Добавлен выбор. Слишком много прыгающих между vb.net и C#. –

Смежные вопросы