Как вы используете Flatten List & lt; T & gt; в C #, если T = List & lt; T & gt ;? [Дубликат]

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

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
236
задан Babak Naffas 7 May 2014 в 01:00
поделиться

5 ответов

Попробуйте SelectMany()

var result = iList.SelectMany( i => i );
426
ответ дан kalyfe 18 August 2018 в 12:25
поделиться
  • 1
    Спасибо, я всегда забываю об этом - я знаю, что он есть, но я просто трачу слишком много времени на Googling для него каждый раз, когда мне нужно его использовать. Закладка этого ответа. :-) – BrainSlugs83 19 December 2013 в 20:51
  • 2
    Некоторое время я боялся, что я единственный, кто когда-либо нуждался в этом. Спасибо, Майк! – Arnab Chakraborty 14 April 2015 в 08:52
  • 3
    Есть ли альтернативный синтаксис для SelectMany( i => i )? Я видел, что этот синтаксис используется много, но кажется, что это дегенеративное использование функции выбора, поэтому я ожидал, что разработчики языка придумают синтаксис ярлыков специально для списков списков – Andy 9 February 2017 в 13:15

Если у вас есть List<List<int>> k, вы можете сделать

List<int> flatList= k.SelectMany( v => v).ToList();
7
ответ дан Daniel 18 August 2018 в 12:25
поделиться
iList.SelectMany(x => x).ToArray()
21
ответ дан Dylan Beattie 18 August 2018 в 12:25
поделиться
  • 1
    @recursive Что пропустили все остальные? .ToArray()? - Это косвенное - если вам нужно только повторить попытку, или если элементы могут измениться, значит, .ToArray() определенно не то, что вы хотите. Но со статическими элементами, которые вы собираетесь перечислить несколько раз, .ToList() или .ToArray() даст улучшение производительности (за счет немного более высокой загрузки памяти, что, как правило, довольно неплохо). – BrainSlugs83 19 December 2013 в 20:55
  • 2
    Предположительно, обстоятельства в этом случае требуют массивов, поскольку это было указано в вопросе. – recursive 19 December 2013 в 23:49
  • 3
    @recursive, если мы nitpicking, OP говорит, что ему нужно вернуть List<int>, поэтому .ToList() будет правильным выбором. – MEMark 26 February 2014 в 18:48

Как это?

var iList = Method().SelectMany(n => n);
9
ответ дан mquander 18 August 2018 в 12:25
поделиться

С синтаксисом запроса:

var values =
from inner in outer
from value in inner
select value;
73
ответ дан recursive 18 August 2018 в 12:25
поделиться
  • 1
    +1 для альтернативного синтаксиса – Tim Jarvis 19 October 2009 в 20:57
  • 2
    Спасибо точный синтаксис, который я искал, и так много SO-ответов перечисляют что-то еще более подробное. – SilverSideDown 4 February 2014 в 23:19
  • 3
    Это намного лучше, чем SelectMany. Более ясно, что происходит с IMO, спасибо, что указали это! – Bryan Rayner 14 September 2016 в 15:49
  • 4
    Лично я всегда нахожу версию синтаксиса запроса гораздо менее интуитивной, чем версия для вызова метода. Когда Resharper предлагает преобразовать циклы в выражения LINQ, если он дает мне синтаксис запроса, я всегда отказываюсь отменить. – bikeman868 23 September 2016 в 23:50
Другие вопросы по тегам:

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