Я хочу проверить количество IEnumerable, но это очень неэффективно - PullRequest
3 голосов
/ 07 июля 2010

Особая благодарность Rex M за этот кусочек мудрости :

    public IEnumerable<Friend> FindFriends()
    {
        //Many thanks to Rex-M for his help with this one.
        //https://stackoverflow.com/users/67/rex-m

        return doc.Descendants("user").Select(user => new Friend
        {
            ID = user.Element("id").Value,
            Name = user.Element("name").Value,
            URL = user.Element("url").Value,
            Photo = user.Element("photo").Value
        });
    }

После нахождения всех друзей пользователей мне нужно показать их в форме WPF.У меня проблема в том, что не у всех пользователей есть хотя бы 5 друзей, у некоторых даже нет друзей!Вот что у меня есть:

    private void showUserFriends()
    {
        if (friendsList.ToList().Count > 0)
        {
            friend1.Source = new BitmapImage(new Uri(friendsList.ToList()[0].Photo));
            label11.Content = friendsList.ToList()[0].Name;

            friend2.Source = new BitmapImage(new Uri(friendsList.ToList()[1].Photo));
            label12.Content = friendsList.ToList()[1].Name;

            //And so on, two more times. I want to show 4 friends on the window.
        }            
    }

Итак, этот вопрос состоит из двух частей:

  1. Как вы предлагаете мне справиться с различным количеством друзей, которое может иметь пользователь.С моим текущим кодом, если у пользователя нет друзей, я получаю исключение IndexOutOfBounds, потому что friendsList [0] не существует.

  2. Как я могу более эффективно обрабатывать проверку того,у пользователя есть друзья?Вызов .ToList () кажется очень сложным.

Ответы [ 4 ]

3 голосов
/ 07 июля 2010

1) Свяжите данные из списка друзей с ListBox. Вы можете использовать шаблоны данных для отображения изображений и меток.

2) Звоните Any().

2 голосов
/ 07 июля 2010

В этом случае просто вызовите ToList() один раз перед оператором if, а не создавайте список каждый раз.

EDIT

Возможно, вы захотите взглянуть на шаблон MVVM и использовать XAML для привязки элементов управления к данным

1 голос
/ 07 июля 2010

Когда вы вызываете 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});
  }
}
1 голос
/ 07 июля 2010

Используйте какой-либо элемент управления ItemContainer, например, любой ItemsControl . Вы просто указываете шаблон для того, как должен выглядеть элемент, и устанавливаете его свойство ItemsSource:

myItemsControl.ItemsSource = new ObservableCollection(myFriends.Take(4));

Это покажет до 4 друзей, повторяя шаблон столько раз, сколько необходимо, но всего 0, если коллекция пуста.

...