Оператор LINQ, который вы написали, не изменяет коллекцию, он фактически создает новую.
Метод расширения, который вы написали, создает эту новую коллекцию, а затем отбрасывает ее.Назначение является избыточным: вы присваиваете локальный параметр, который выходит за пределы области сразу после.
Когда вы вызываете метод, вы также отбрасываете его результат, а не присваиваете его обратно.
Следовательно, вы должны написать метод следующим образом:
public static List<string> ReplaceStringInListWithAnother(
this List<string> my_list, string to_replace, string replace_with)
{
return (from s in my_list select
(s == to_replace ? replace_with : s)).ToList();
}
и вызов как этот:
strings = strings.ReplaceStringInListWithAnother("delete", "");
Кстати, вы можете сделатьФункция более полезна, сделав ее общей:
public static List<T> ReplaceInList<T>(this List<T> my_list,
T to_replace, T replace_with) where T : IEquatable<T>
{
return (from s in my_list select
(s.Equals(to_replace) ? replace_with : s)).ToList();
}
Таким образом, вы можете использовать ее для других целей, а не только для string
с.Кроме того, вы также можете объявить, что он использует IEnumerable<T>
вместо List<T>
:
public static IEnumerable<T> ReplaceItems<T>(this IEnumerable<T> my_list,
T to_replace, T replace_with) where T : IEquatable<T>
{
return from s in my_list select (s.Equals(to_replace) ? replace_with : s);
}
Таким образом, вы можете использовать его для любой коллекции уравниваемых предметов, а не только для List<T>
.Обратите внимание, что List<T>
реализует IEnumerable<T>
, так что вы все равно можете передать List в эту функцию.Если вы хотите получить список, просто позвоните .ToList()
после вызова этого.
Обновление: Если вы действительно хотите заменить элементы в списке вместосоздания нового, вы все еще можете сделать это с помощью метода расширения, и он все еще может быть общим, но вы не можете использовать Linq и вы не можете использовать IEnumerable<T>
:
public static void ReplaceInList<T>(this List<T> my_list,
T to_replace, T replace_with) where T : IEquatable<T>
{
for (int i = 0; i < my_list.Count; i++)
if (my_list[i].Equals(to_replace))
my_list[i] = replace_with;
}
Thisне вернет новый список, но вместо этого изменит старый, поэтому он имеет тип возврата void , как ваш оригинал.