2009-05-09 4 views
2

Можно ли модифицировать элементы коллекции, скажем, список, LinkedList и т.д., используя что-то вроде:Изменение значений непосредственно с помощью LINQ?

collection.Do (action) 

, который делает что-то вроде:

item.Value = 0 
(for each item) 

Я знаю счетчикам только дать значение, не ссылка, следовательно, вопрос.

Как это сделать с помощью LINQ?

ответ

6

Try:

void ModifyEach<T>(this IList<T> list, Func<T, T> modifier) 
{ 
    for (int n = 0; n < list.Count; n++) 
     list[n] = modifier(list[n]); 
} 

Использование:

List<int> x = new List<int> { 1, 3, 7 }; 

x.ModifyEach(n => n + 1); // increment each item 
+0

Спасибо, тоже будет работать для IEnumerable, правильно? –

+0

Если вы не используете IEnumerable.ElementAt(), поскольку по умолчанию IEnumerable не предоставляет произвольный доступ. Вы не можете использовать foreach, потому что это изменит коллекцию. – Andy

+1

Нет, он может работать только с интерфейсом коллекции, который позволяет вам изменять содержимое списка в определенной позиции, что в основном означает IList или IDictionary. –

2

Если ваша коллекция содержит ссылочные типы, то вы можете изменить его элементы на месте, используя метод расширения, подобный 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); 
} 
Смежные вопросы