Как объединить два списка IQueryable - PullRequest
47 голосов
/ 23 октября 2010

Я хочу объединить записи двух списков IQueryable в C #. Я стараюсь

IQueryable<MediaType> list1 = values;
IQueryable<MediaType> list2 = values1;
obj.Concat(obj1);

и

IQueryable<MediaType> list1 = values;
IQueryable<MediaType> list2 = values1;
obj.Union(obj1);

но если list1 пусто, то результирующий список также пуст. В моем случае либо list1 может быть пустым, но list2 может иметь записи. Как мне их объединить?

Ответы [ 3 ]

73 голосов
/ 23 октября 2010

Вы не используете возвращаемое значение - как и все другие операторы LINQ, метод не меняет существующую последовательность - он возвращает новую последовательность.Поэтому попробуйте это:

var list3 = list1.Concat(list2);

или

var list4 = list1.Union(list2);

Union - это операция набора - она ​​возвращает различные значения.

Concat просто возвращает элементы изпервая последовательность, за которой следуют элементы из второй последовательности;результирующая последовательность может содержать повторяющиеся элементы.

Вы можете думать о Union как Concat, за которым следует Distinct.

2 голосов
/ 23 октября 2010

Даже

var result = Enumerable.Concat(list1, list2);

не работает?

И убедитесь, что списки пустые, а не нулевые:

var result = Enumerable.Concat(
    list1 ?? Enumerable.Empty<MediaType>()
    list2 ?? Enumerable.Empty<MediaType>());

Также попробуйте:

var result = Enumerable.Concat(
    list1.AsEnumerable(),
    list2.AsEnumerable());
0 голосов
/ 13 ноября 2014

Другой вариант, который я нашел:
Объявите:
IEnumerable<int> usersIds = new int[0];
Например, внутри цикла:

foreach (var id in Ids) {
            IQueryable<int> _usersIds = bl.GetUsers(id).Select(x => x.UserID);
            usersIds = usersIds.Concat(_usersIds);
        }  
var ids = usersIds.Distinct();

Теперь usersIds и ids (как отдельные) содержат идентификатор всех пользователей как IEnumerable -int-

...