2015-02-06 2 views
-1

В чем разница между IEnumerable & ObservableCollection in C#?В чем разница между IEnumerable и ObservableCollection?

Например, в этом фрагменте кода:

public class RecipeDataItem 
{   
    public RecipeDataItem(String uniqueId, String title, String subtitle, String description, String imagePath, String tileImagePath, int prepTime, String directions, IEnumerable<string> ingredients) 
    { 
     this.UniqueId = uniqueId; 
     this.Title = title; 
     this.Subtitle = subtitle; 
     this.Description = description; 
     this.ImagePath = imagePath; 
     this.TileImagePath = tileImagePath; 
     this.PrepTime = prepTime; 
     this.Directions = directions; 
     this.Ingredients = new ObservableCollection<string>(ingredients); 
    } 

    public string UniqueId { get; private set; } 
    public string Title { get; private set; } 
    public string Subtitle { get; private set; } 
    public string Description { get; private set; } 
    public string ImagePath { get; private set; } 
    public string TileImagePath { get; set; } 
    public int PrepTime { get; set; } 
    public string Directions { get; set; } 
    public ObservableCollection<string> Ingredients { get; private set; } 

    public override string ToString() 
    { 
     return this.Title; 
    } 
} 

мы определяем переменную Ingredients, которая является ObservableCollection строк, & то мы определяем переменную в спараметрированной конструктор ingredients который является IEnumerable строк.

+3

Вы не можете сравнить их. Один из них - интерфейс, один - класс ... И, кстати, 'ObservableCollection ' реализует 'IEnumerable ' ... –

+0

Ваш вопрос _ «какая разница» _, кажется, не имеет смысла. Что вы на самом деле хотите знать? – CodeCaster

+0

«IEnumerable», как правило, вы можете перечислить, например, коллекции элементов или генераторов. «ObservableCollection» - это список, который вызывает события при его изменении. Один абстрактный и широкий, другой конкретный и конкретный. Обратите внимание, что 'ObservableCollection' реализует' IEnumerable', среди других интерфейсов. –

ответ

1

IEnumerable - это список элементов, которые вы можете перечислить, т. Е. Вы можете перемещаться в одном направлении, от первого до последнего элемента.

Наблюдаемая коллекция реализует интерфейсы INotifyCollectionChanged и INotifyPropertyChanged. Это список, который вызывает события всякий раз, когда изменяется содержимое (элемент добавляется, удаляется) или изменяется свойство.

IEnumerable достаточно, если вы просто хотите перебирать содержимое; если вам нужен доступ к любому элементу в любой момент, лучше использовать более сильную реализацию, такую ​​как Список. IEnumerable - «самый слабый» интерфейсов коллекции, но достаточно часто.

+3

'IEnumerable' - это не список, это интерфейс. Список - это деталь реализации. –

+0

Я не сказал, что 'IEnumerable' - это список. Я сказал ** ** «IEnumerable» - список элементов, которые вы можете перечислить. –

3

Ну, в первую очередь IEnumerable<T> и ObservableCollection<T> - это то, что вы даже не можете сравнить друг с другом. Основная причина заключается в том, что IEnumerable<T> - это интерфейс (все интерфейсы в .NET framework имеют имя, которое начинается с I, напримери IList<T>) и ObservableCollection<T> - это класс коллекции, который действительно реализует интерфейс IEnumerable<T>.

Интерфейс, такой как IEnumerable<T>, является чем-то абстрактным, в котором вы можете объявить только подпись методов, например, но вы не можете реализовать свою логику. Класс, реализующий интерфейс, реализует логику всех методов, существующих в интерфейсе. Обычно коллекция, например IEnumerable<string> results, возвращается из общедоступного метода службы или приложения, чтобы перечислить ее позже, используя цикл foreach. Более того, эта коллекция имеет lazy evaluation, и по этой причине она очень полезна всякий раз, когда коллекция содержит много предметов, но ее следует использовать осторожно. Некоторые классы коллекций, реализующие этот интерфейс, - ObservableCollection<T>, List<T>, Dictionary<TKey,TValue>.

ObservableCollection<T> - это класс коллекции, который реализует интерфейс IEnumerable<T>. Более того, это специальная коллекция, потому что она вызывает события всякий раз, когда сама коллекция изменяется, например, когда некоторые элементы добавляются или удаляются. Он в основном используется в приложениях WPF.