Я в ситуации, когда просто хочу добавить значения в строковый массив (тип String []) к объекту с помощью IList <String>. Быстрый поиск по MSDN показал, что метод IList <T> имеет только версию, которая принимает индекс и объект T, и не имеет версии, которая принимает IEnumerable <T> вместо T. Означает ли это, что Я должен написать цикл над списком ввода, чтобы поместить значения в список адресатов? Если это так, для меня это выглядит очень ограниченным и довольно недружелюбным дизайном API. Может быть, я что-то упустил. Что делают специалисты C# в этом случае?Почему у IList <T> нет методов Insert, которые принимают IEnumerable <T>?
23
A
ответ
38
Поскольку интерфейс, как правило, является наименьшей функциональностью, необходимой для его использования, чтобы уменьшить нагрузку на разработчиков. С C# 3.0 вы можете добавить это в качестве метода расширения:
public static void AddRange<T>(this IList<T> list, IEnumerable<T> items) {
if(list == null) throw new ArgumentNullException("list");
if(items == null) throw new ArgumentNullException("items");
foreach(T item in items) list.Add(item);
}
et voila; IList<T>
теперь AddRange
:
IList<string> list = ...
string[] arr = {"abc","def","ghi","jkl","mno"};
list.AddRange(arr);
вы могли бы сделать это, но его имеет свои риски, когда вы звоните AddRange, вы можете ожидать, что основной объект, чтобы иметь некоторое представление о том, что он работает на диапазоне. В сценарии привязки данных это может привести к запуску тысяч событий в сценарии, где одного события было бы достаточно. –
@Sam; в самом деле; но это лучшее, что вы можете сделать через IList; есть способы компенсировать, конечно ... –
Спасибо за ответ Марк. Я все еще чувствую, что интерфейс должен быть разработан таким образом, чтобы удобство использования было больше, чем простота его реализации, учитывая, что добавление списка в другой список является такой общей операцией. Во всяком случае, метод расширения в этом случае отлично работает, поэтому не может быть что-то интересное. – Kei