Объединение списков в Lambda/LINQ

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

16
задан phoog 16 April 2012 в 21:18
поделиться

6 ответов

SelectMany - т.е.

        IEnumerable<List<string>> someList = ...;
        IEnumerable<string> all = someList.SelectMany(x => x);

Для каждого объекта в someList, это тогда использует лямбду "x => x" для получения IEnumerable< T> для внутренних объектов. В этом случае каждый "x" является List< T> который уже является IEnumerable< T>.

Они тогда возвращаются как непрерывный блок. По существу SelectMany, чему-то нравится (упрощенный):

static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector) {

    foreach(TSource item in source) {
      foreach(TResult result in selector(item)) {
        yield return result;
      }
    }
}

, Хотя это упрощено несколько.

33
ответ дан 30 November 2019 в 16:14
поделиться

Как насчет

myStrings.SelectMany(x => x)
7
ответ дан 30 November 2019 в 16:14
поделиться

Не точно вызов отдельного метода, но необходимо быть в состоянии записать

var concatenated = from list in lists from item in list select item;

, Где 'списки' - Ваш IEnumerable<List<string>>, и связанный имеет тип IEnumerable<string>.

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

2
ответ дан 30 November 2019 в 16:14
поделиться

Сделайте простой метод. Никакая потребность в LINQ:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
   foreach (List<string> list in lists)
   foreach (string item in list)
   {
     yield return item;
   }
 }
0
ответ дан 30 November 2019 в 16:14
поделиться

Используя выражение LINQ...

IEnumerable<string> myList = from a in (from b in myBigList
                                        select b)
                             select a;

... работает просто великолепно.:-)

b будет IEnumerable<string>, и a будет string.

0
ответ дан 30 November 2019 в 16:14
поделиться

Вот другое понимание запроса LINQ.

IEnumerable<string> myStrings =
  from a in mySource
  from b in a
  select b;
0
ответ дан 30 November 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: