Когда вы вызываете ToList () для IEnumerable, то вы делаете перечисление всех элементов перечислимого списка и помещение результатов в контейнер.Таким образом, «запах кода» - это код, вызывающий ToList () несколько раз в одном и том же IEnumerable, его следует выполнить только один раз и сохранить в переменной.
Существует простое эмпирическое правило.Если вы работаете со списком IEnumerable в целом (выражения Linq) или просто перемещаетесь по списку от начала до конца, тогда используйте IEnumerable, если вам нужен доступ к списку по индексу, или подсчет количества элементов или навигация в обоих направлениях поlist, сначала создайте контейнер List и используйте его.
т.е.
List<Friend> friends = FindFriends().ToList();
//Then use the friends list....
Теперь, что касается того, есть ли что-то в вашем списке или нет, как упомянули здесь пара человек,вы можете использовать привязку данных и такой элемент управления, как ItemsControl, но если вы хотите динамически создавать элементы пользовательского интерфейса, используйте цикл, не индексируйте в массив.
List<Friend> friends = FindFriends().ToList();
if(friends.Count > 0)
{
foreach(Friend f in friends)
{
//Create your Control(s) and add them to your form or panel's controls container
// somthing like (untested) myPanel.Controls.Add(new Label(){Text = f.Name});
}
}