Почему List <T>.Remove (T) одинокий перемещает первый совпадающий элемент?

У меня есть следующая проблема.

У меня есть один List<string> с информацией, которая может меняться в зависимости от взятых действий, и я нуждаюсь в том, чтобы переместить все элементы, которые совпадают с string.

Я протестировал следующий код в List<T>:

List<string> Strings = new List<string>() {
    "658", "123", "321", "123"
};
foreach (string s in Strings) Console.WriteLine(s); // Imprime: 658, 123, 321, 123
Strings.Remove("123");
foreach (string s in Strings) Console.WriteLine(s); // Imprime: 658, 321, 123

И я нуждаюсь в том, что útimo цикл foreach возвратите 658, 321.

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

Привет.

8
задан 28.06.2016, 18:18
3 ответа

Есть несколько альтернатив, для которого ты разыскиваешь, ты мог бы использовать

List<string> Strings = new List<string>() {
    "658", "123", "321", "123"
};

foreach (string s in Strings) Console.WriteLine(s);
Strings.RemoveAll(x=> x=="123");
foreach (string s in Strings) Console.WriteLine(s);

или помогать тебе с linq

List<string> Strings = new List<string>() {
    "658", "123", "321", "123"
};

foreach (string s in Strings) Console.WriteLine(s);
Strings = Strings.Where(x=> x != "123").ToList();
foreach (string s in Strings) Console.WriteLine(s);

с linq, главным образом ты просачиваешься снимая стоимость, что ты не хочешь

13
ответ дан 24.11.2019, 13:58

Remove sГіlo удаляет первую составную часть, чтобы удалять все совпадения, у тебя есть несколько выборов:

  1. Использовать RemoveAll ( documentaciГіn ), в частности:

    Strings.RemoveAll(x => x == "123");
    

    Важно отмечать, что RemoveAll он обновляет настоящий список.

  2. хорошая Другая opciГіn состоит в том, чтобы использовать Linq, чтобы это делать (с Select):

    List<string> Strings2 = Strings.Select(x => x != "123"); //Sin el ToList()!
    
  3. TambiГ©n с Linq но с where (я предпочитаю ее opciГіn Select):

    List<string> Strings2 = Strings.Where(x => x != "123").ToList();
    
7
ответ дан 24.11.2019, 13:58

Я не эксперт в C#, но возможно deberГ-схвати использования mГ©todo RemoveAll вместо Remove

Console.WriteLine("\n{0} elementos quitados mediante RemoveAll(MetodoDeFiltrado()).", 
            lista.RemoveAll(MetodoDeFiltrado()));
2
ответ дан 24.11.2019, 13:58