Если ваша коллекция содержит ссылочные типы, то вы можете изменить его элементы на месте, используя метод расширения, подобный ForEach
методом на List<T>
,
Это возможно, потому что вы на самом деле не пытаетесь изменить последовательность IEnumerable<T>
: коллекция содержит ссылки, но вы только изменяете ссылочные объекты, а не сами ссылки.
Этот метод не будет работать для коллекций типов значений. В этом случае вы попытаетесь изменить последовательность только для чтения, IEnumerable<T>
, что невозможно.
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (T item in source)
{
action(item);
}
}
// ...
public class Example
{
public int Value { get; set; }
}
// ...
Example[] examples =
{
new Example { Value = 1 }, new Example { Value = 2 },
new Example { Value = 3 }, new Example { Value = 4 }
};
examples.ForEach(x => x.Value *= 2);
// displays 2, 4, 6, 8
foreach (Example e in examples)
{
Console.WriteLine(e.Value);
}
Спасибо, тоже будет работать для IEnumerable, правильно? –
Если вы не используете IEnumerable.ElementAt(), поскольку по умолчанию IEnumerable не предоставляет произвольный доступ. Вы не можете использовать foreach, потому что это изменит коллекцию. – Andy
Нет, он может работать только с интерфейсом коллекции, который позволяет вам изменять содержимое списка в определенной позиции, что в основном означает IList или IDictionary. –