Удалить из списка <T>на основании совпадения подстроки - PullRequest
0 голосов
/ 22 февраля 2012
sampleList.RemoveAll(a=>a.reference.Contains("123"));

Эта строка кода не удаляет какой-либо элемент из списка, тогда как

sampleList.RemoveAll(a=>!a.reference.Contains("123"));

удаляет все предметы.

В настоящее время я прибегаю к созданию другого списка, прохождению цикла for и добавлению материала во второй список, но мне не очень нравится этот подход.

Есть ли более чистый способ достичь того, что я пытаюсь?

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

Тот факт, что второй пример «удаляет все элементы», а первый не удаляет ни одного, приводит меня к выводу, что ни одно из свойств reference элемента в списке не содержит строку «123».

Элементри мой дорогой Ватсон;)

0 голосов
/ 22 февраля 2012

Я бы предположил, что ваш sampleList не содержит элементов, содержащих "123". Это подтверждается тем фактом, что первая попытка ничего не удаляет, а вторая попытка (противоположная первой) удаляет все.

Вот пример консольного приложения, которое я написал, чтобы проверить, чего, по-моему, вы пытаетесь достичь, и оно работает:

static void Main(string[] args)
{
    List<string> sampleList = new List<string>(new string[]
    {
        "Some String", "Some Other String", "Hello World", "123456789", "987654123"
    });

    Console.WriteLine("Items:");
    foreach (string item in sampleList)
    {
        Console.WriteLine(item);
    }

    Console.WriteLine("\nRemoving items containing \"123\"...");

    int itemsRemoved = sampleList.RemoveAll(str => str.Contains("123"));
    Console.WriteLine("Removed {0} items.", itemsRemoved);

    Console.WriteLine("\nItems:");
    foreach (string item in sampleList)
    {
        Console.WriteLine(item);
    }

    Console.ReadKey();
}

Начните с проверки значений предметов в вашей коллекции. Убедившись, что значения содержат то, что должны, проверьте возвращаемое значение RemoveAll(...), чтобы убедиться, что правильное количество элементов было удалено.

...