2015-04-30 2 views
0

Ситуация: Мне нужно передать коллекцию объектов, а затем сгруппировать их. Я знаю, что я могу использовать LINQ для этого.Коллекция коллекций VS Словарь коллекций в C#?

Однако, если бы я должен был это сделать сам, Есть ли какие-либо предпочтения между тем, чтобы мой метод возвращался? Коллекция коллекций VS Словарь коллекций? Я знаю, что Словарь также является сборником, но он вводит ключевой параметр.

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

Заранее спасибо.

+0

Словарь, вероятно, путь. Как вы их группируете (т. Е. Может быть проще сказать, если вы дадите нам структуру ваших объектов)? –

+0

* Предполагаемое использование для возвращаемого объекта должно отображаться в группах с использованием оператора For Each. * Вам нужно будет иметь дело с группировкой элементов? Или они уже возвращаются сгруппированными? –

+0

Если вам нужно получить доступ к определенной коллекции в любое время, я бы рекомендовал словарь, если нет, вам не нужно иметь ключ, а коллекция коллекций будет достаточно – Sidewinder94

ответ

0

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

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

Середина спектра - словарь с примитивным ключом. Теперь у вас есть информация о каждом вложенном списке, KeyValuePair Key. Этот ключ может быть своего рода уникальным идентификатором, определяющим общежитие.

Другой конец спектра - это неограниченные метаданные. Вы определяете класс для элементов во внешнем списке, и свойство этого элемента является коллекция:

class Dorm { 

    public int DormID {get;set;} 
    public string DormName {get;set;} 
    public Gender DormPermittedGender {get;set;} 
    public List<Person> Students {get;set;} 
} 

class Person { 
    public string Name {get;set;} 
    public Gender Gender {get;set;} 
    public int Age{get;set;} 
} 

///... 
List<Dorm> dorms = db.Dorms.Select(d=> 
    new Dorm { 
    DormId = d.Id, 
    DormName = d.Name, 
    DormPermittedGender = d.PermittedGender, 
    Students = d.StudentsResiding 
    } 
) 

foreach(Dorm dorm in dorms) 
{ 
    foreach(Person student in dorm.Students) 
    { 
     Console.Writeline(student.Name + " lives in " + dorm.DormName); 
    } 
} 

Обратите внимание, как читаемым, что Еогеасп есть. Никаких таинственных ключей.

Теперь словарь действительно способен на это, поскольку у вас могут быть сложные объекты как Ключ, но он не такой организованный. Если ситуация требует этого, строго типизированные объекты лучше отражают отношения.

Чрезмерное использование списка списков или словарей может затруднить чтение кода, так как нет имен, описывающих свойства. Вы сталкиваетесь с каким-то старым кодом, и вам нужно прыгать, чтобы найти, где Словарь был впервые назначен для определения значения ключа, потому что все, что у вас есть, это тип int, который не передает семантики.

0

Суммируя комментарии:

  • Если вам нужно для поиска конкретного элемента: Словаря => Поскольку время поиска является O (1)
  • Если вам нужно только итерация через все пункты: Оба будут делать, поскольку время поиска будет о (п) в обоих случаях
+0

Мне кажется, что словарь - лучший выбор, потому что, если мне когда-либо понадобится расширить мою систему и на самом деле искать 1 элемент за раз, это будет более эффективно, это правильно? – Alexus

+0

Если вы чувствуете, что вам понадобится эта функция в будущем, да. – Sidewinder94

0

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

A SortedDictionary или SortedList, всегда отсортированный по значению ключа, может быть уместным, если порядок ключей соответствует заданному порядку элементов.

В противном случае просто используйте обычный массив/List/Collection, в котором вы можете вручную разместить предметы точно в том порядке, в котором вы хотите.

0

Вы опубликовали довольно расплывчатый вопрос, но давайте работать с ним и сделать его более конкретным. Давайте предположим, что у вас есть коллекция этого класса:

public class MyItem 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public DateTime OrderDate { get; set; } 
} 

И у вас есть метод, что группы это (и, возможно, фильтры, ... делает другие вещи), как это:

public RETURNTYPE ProcessItemGroupedByOrderDate(IEnumerable<MyItem> items); 

То есть предполагается группировать по OrderDate собственности.

И ваш вопрос:

Есть ли предпочтения между обладанием мой метод возврата Коллекция Коллекции VS Словарь коллекций? Предполагаемое использование для возвращаемого объекта необходимо отобразить в группах, используя для каждого оператора.

I.e.должны быть RETURNTYPE

  • IDictionary<DateTime, ICollection<MyItem>> или
  • ICollection<ICollection<MyItem>>

, где ICollection представляет собой любой подходящий тип коллекции (IEnumerable, IList, ...).

Ответом будет: дайте клиенту решить. Если вы возвращаете группировку, пусть возвращаемый тип будет просто:

IEnumerable<IGrouping<DateTime, MyItem>>