IEnumerable <T>.Concat - замена, которая может работать без изменения ссылки? - PullRequest
2 голосов
/ 28 марта 2010

Я недавно был укушен (на мой взгляд, слишком общепринятым) значением Concat, которое возвращает результат, а не добавляется в сам список

Например.

List<Control> mylist=new List<Control>;
//.... after adding Controls into mylist
MyPanel.Controls.Concat(mylist); //This will not affect MyPanel.Controls at all.

MyPanel.Controls=MyPanel.Controls.Concat(mylist); //This is what is needed, but the Controls reference can not be reassigned (for good reason)

Так есть ли другой способ объединения двух списков, который будет работать, когда ссылка на коллекцию доступна только для чтения?

Это единственный способ сделать это с foreach?

foreach(var item in mylist){
  MyPanel.Controls.Add(item);
}

Есть ли лучший путь без foreach?

Ответы [ 4 ]

5 голосов
/ 28 марта 2010

Многие коллекции имеют метод AddRange, winforms ControlCollection является одной из них .

MyPanel.Controls.AddRange(mylist.ToArray());

Преимущество этого заключается в том, что контейнеру нужно будет добавить сразу несколько элементов управления, поэтому он может отложить шаги макета до завершения добавления всех из них.

1 голос
/ 28 марта 2010
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items) {
    foreach(T item in items) collection.Add(item);
}

Тогда у вас есть:

anyGenericCollection.AddRange(someSequence);

Конечно, некоторые коллекции (List<T>, ControlCollection и т. Д.) Уже имеют и AddRange - это просто делает его доступным для тех, кто этого не делает.

1 голос
/ 28 марта 2010

Ваш вопрос спрашивает об IEnumerable, и ответом на него всегда является «Нет» - IEnumerable - это «поток» элементов, предназначенный только для пересылки.

Однако, если вы можете использовать более специализированный тип - ICollection, IList и т. Д. - тогда вы можете использовать методы Add или AddRange, если они доступны.

0 голосов
/ 28 марта 2010

В случайном случае вы предпочитаете заглавные буквы ForEach, а не foreach в нижнем регистре:

mylist.ForEach(MyPanel.Controls.Add); 
...