2016-05-27 3 views
2

Я новичок в C# linq. Просто интересно, возможно ли комбинировать следующие два выражения linq в одном.Операции C# linq

var l = str.Split(new[] { '\n' }, 
     StringSplitOptions.RemoveEmptyEntries) 
     .Select(p => p.Trim()) 
     .Where(p =>!string.IsNullOrWhiteSpace(p)) 
     .ToArray(); 
foreach (var w in l) {  
    var dd = w.Split(new[] { ' ' }, 
    StringSplitOptions.RemoveEmptyEntries) 
    .Select(p => p.Trim()) 
    .Where(p => !string.IsNullOrWhiteSpace(p)) 
    .Concat(new[] { "\n" }); 
    } 

Любая помощь приветствуется. Большое спасибо.

+0

Что вы делаете с 'dd'? Как написано, это не делает ничего полезного, кроме присвоения 'l'. Вы заботитесь о структуре линии или просто хотите разделить пространство или новую строку (что Split может сделать самостоятельно)? –

+0

@IanMercer, я использую dd для распечатки инструкций, чтобы увидеть, действительно ли это работает. Строковая структура имеет значение, разделяется новой строкой, а затем для каждой новой строки разбивается на пустое пространство. – user6392957

ответ

3

SelectMany ваш друг:

var l = str.Split(new[] { '\n' }, 
    StringSplitOptions.RemoveEmptyEntries) 
    .Select(p => p.Trim()) 
    .Where(p =>!string.IsNullOrWhiteSpace(p)) 
    .SelectMany(w => w.Split(new[] { ' ' }, ringSplitOptions.RemoveEmptyEntries) 
    .Select(p => p.Trim()) 
    .Where(p => !string.IsNullOrWhiteSpace(p)) 
    .Concat(new[] { "\n" }); 
+0

, что будет работать, за исключением того факта, что 'RemoveEmptyEntries' и'! String.IsNullOrWhiteSpace (p) 'немного избыточно –

+0

@alexm, спасибо большое. – user6392957

+0

@ScottSelby, спасибо огромное. – user6392957

0

Если все, что вы заботитесь о мешок слов, используйте string.Split и передать его как символ новой строки и символ пробела, нет необходимости делать это в двух шаги и объединить их, используя SelectMany.

Если, однако, вы хотите каким-либо образом захватить структуру линии в том, что вы обрабатываете, например. для создания последовательности последовательностей, представляющих строки и слова в каждой строке, затем снова используйте Select.

var l = str.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(p => p.Trim()) 
    .Where(p =>!string.IsNullOrWhiteSpace(p)) 
    .Select(l => l.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) 
     .Select(p => p.Trim()) 
     .Where(p => !string.IsNullOrWhiteSpace(p))); 

l is IEnumerable<IEnumerable<string>>.

Смежные вопросы