Как объединить два IList вместе

У меня есть два IList, которые получают значения из отдельных таблиц в базе данных. Эти таблицы содержат одни и те же столбцы и значения, но по другим причинам клиент должен хранить их в отдельных таблицах.

private IList<MeterReadingDto> _meterReadings;
private IList<PseudoReadingDto>  _pseudoReading;
public IList<MeterReadingDto> MeterReadings
    {
        get
        {
            return _meterReadings != null ? _meterReadings.OrderByDescending(x => x.ReadDate).ToList() : null;
        }
        set { _meterReadings = value; }
    }

    public IList<PseudoReadingDto> PseudoReadings
    {
        get
        {
            return _pseudoReading != null ? _pseudoReading.OrderByDescending(x => x.ReadDate).ToList() : null;
        }
        set { _pseudoReading = value; }
    }

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


person Blahwoo    schedule 30.04.2015    source источник
comment
Так почему же вы используете два разных класса для одной и той же структуры данных из двух таблиц?   -  person Viktor Kireev    schedule 30.04.2015
comment
Обратите внимание, что если у них одинаковые столбцы, вы захотите, чтобы они реализовали общий интерфейс, чтобы упростить слияние с Concat, или чтобы они использовали общий базовый класс.   -  person Eric J.    schedule 30.04.2015


Ответы (3)


Что ж, если вы можете извлечь интерфейс (или даже базовый класс) для MeterReadingDto и PseudoReadingDto, то вы можете объединить их с IEnumerable или IList этого.

i.e.

public IEnumerable<BaseReadingDto> AllReadings {
  get{
    return MeterReadings.Concat(PseudoReadings);
  }
}
person SWeko    schedule 30.04.2015

Вы должны иметь возможность обрабатывать как PseudoReadingDto, так и MeterReadingDto как один и тот же тип объекта. Вы можете изучить анонимные типы, но я предлагаю реализовать один и тот же интерфейс (например, IReadingDto). Затем вы можете создать новый List<IReadingDto> и объединить списки.

Если они имеют один и тот же тип, вы можете использовать List.AddRange() для объединения списков.

person ryanyuyu    schedule 30.04.2015
comment
Использование AddRange особенно эффективно по сравнению с Concat, если вы заранее знаете размер окончательного списка stackoverflow.com/a/4488073/141172< /а>. - person Eric J.; 30.04.2015

Рассмотрите возможность использования расширения метода IEnumerable Union.

ПРИМЕЧАНИЕ. Использование этой операции приведет к удалению повторяющихся элементов между двумя коллекциями из результата.

person Scott Nimrod    schedule 30.04.2015
comment
Union отбросит любые элементы, которые являются общими для двух IList. - person Eric J.; 30.04.2015
comment
Ох, ладно. Я видел это примечание: метод Concat‹TSource› отличается от метода Union, потому что метод Concat‹TSource› возвращает все элементы во входных последовательностях, включая дубликаты, тогда как Union возвращает только уникальные значения. Спасибо за разъяснения. - person Scott Nimrod; 30.04.2015