Это должно делать то, что вы хотите (хотя он использует мутацию внутри, он чувствует себя функциональным с точки зрения вызывающего абонента):
public List<Tuple<T, double>> Replace(List<Tuple<T, double>> collection, T term, double value) {
var result = collection.Where(x => !x.Item1.Equals(term)).ToList();
result.Add(Tuple.Create(term, value));
return result;
}
Альтернативный способ сделать это - использовать "map" (select
в LINQ):
public List<Tuple<T, double>> Replace(List<Tuple<T, double>> collection, T term, double value) {
return collection.Select(x =>
Tuple.Create(
x.Item1,
x.Item1.Equals(term) ? value : x.Item2)).ToList();
}
Но это может дать вам результаты, отличные от ваших первоначальных намерений.Хотя для меня это то, о чем я думаю, когда вижу метод с именем Replace
, который заменяет на месте.
ОБНОВЛЕНИЕ
Вы также можетесоздайте то, что вы хотите, как это:
public List<Tuple<T, double>> Replace(List<Tuple<T, double>> collection, T term, double value) {
return collection.
Where(x => !x.Item1.Equals(term)).
Append(Tuple.Create(term, value)).
ToList();
}
Используя Concat
, как упомянуто Одедом:
public static class EnumerableEx {
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, T item) {
return source.Concat(new T[] { item });
}
}