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"


    }
}

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Посмотрите Find или FindAll метода класса List<T>.

Ответ 4

Если вы хотите использовать реализацию равенства для равенства, вы можете использовать метод 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, вы можете сделать следующее (сначала с делегатом, вторым с lambda):

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

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

Ответ 5

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

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