Способ удаления строки из списка, если критерии удовлетворены - PullRequest
0 голосов
/ 18 марта 2020

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

 foreach (var name in list)
            {
                foreach (var stepone in Step1)
                {
                    if (FuzzyMatching(name.Full(), stepone.Full()) >= 90)
                    {
                        csvcontent.AppendLine(name.Full());
                        //find a way to delete list record out of list
                        //list.Remove(name);
                    }
                }
            }

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Вы можете пометить в другом списке все элементы для удаления. Когда l oop закончится, вы можете удалить все элементы в новом созданном списке из этого списка. С LINQ это просто:

list1 = list1.Where(x => !itemToDeleteList.Contains(x)).ToList();
0 голосов
/ 18 марта 2020

Если вы l oop поверх списка с помощью foreach и попытаетесь удалить элемент, вы получите исключение InvalidOperationException:

Коллекция была изменена, операция перечисления может не выполняться

Таким образом, вы можете использовать for l oop, который может обрабатывать изменения в списке. Однако при удалении элемента все более высокие индексы будут смещаться вниз. Это будет означать, что вы пропустите элемент.

Решение состоит в том, чтобы выполнить итерацию в обратном порядке:

var list = new List<string>();

list.Add("a");
list.Add("b");
list.Add("b");
list.Add("c");
list.Add("d");

for (int i = list.Count()-1; i>=0; i--)
{
    if (list[i].Contains("b"))
    {
        list.RemoveAt(i);
    }
}
// result: a, c, d
  • вы должны начинать с "count - 1", потому что это самый высокий фактический индекс
  • последний использованный индекс - 0 (начало списка)
  • и уменьшение индекса после каждой итерации
0 голосов
/ 18 марта 2020

Вы не можете удалить элемент из списка, используя ForEach l oop. В этом случае вы должны использовать для l oop.

var list = new List<string>();

list.Add("a");
list.Add("b");
list.Add("c");
list.Add("d");

for(int i = 0; i < list.Count(); i++)
{
    if(list[i].Contains("a"))
    {
        list.RemoveAt(i);
    }
}

Ваш список результатов будет:

b 
c 
d 

Оставив выше для справки, но к @LarsTech комментарий ниже, list.RemoveAt ломает l oop, поэтому он удалит только 1 элемент. Если вы хотите удалить несколько элементов, другой ответ Алекса с Linq будет самым чистым способом удалить его.

Если вы не хотите создавать второй список для размещения элементов, подлежащих удалению, вы также можете сделать следующее:

for (int i = 0; i < list.Count(); i++)
{
    if (list[i].Contains("a"))
    {
        list = list.Where(x => !x.Contains("a")).ToList();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...