2016-03-27 2 views
2

У меня есть один цикл Еогеасп, я хочу сделать это с помощью LINQЛюбой способ сделать это с помощью LINQ?

foreach (int i in indexes) 
{ 
    char[] ch = new char[1]; 
    input.CopyTo(i, ch, 0, 1); 
    chars.Add(ch[0]); 
} 
  • индексов список целых чисел
  • CHARS приведен список символов
  • входных является a строка

ответ

8

Посмотрим, что делает ваш код.

char[] ch = new char[1]; 
input.CopyTo(i, ch, 0, 1); 

Это документация CopyTo:

Копирует заданное количество символов из указанной позиции в этом случае в указанной позиции в массиве символов Unicode.

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

char ch = input[i]; 

Теперь ваша следующая строка становится намного проще:

chars.Add(ch); 

Так , в общей сложности у вас есть это:

var ch = input[i]; 
chars.Add(ch); 

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

chars.Add(input[i]); 

И поэтому весь цикл становится:

foreach (var i in indexes) 
{ 
    chars.Add(input[i]); 
} 

Это особый случай foreach цикла, в котором каждая итерация вычисляет «нечто» (input[i]) и в конце добавляет, что «что-то» к коллекции (chars.Add). К счастью, это также очень типичный случай цикла, который можно легко превратить в LINQ.

Во-первых, необходимо определить источник, который, как правило, объект, который вы сделали foreach на:

indexes 

Затем вам нужно определить селектор, который является код, который вычисляет «что-то» вы складывали, и передать этот код метода Select:

.Select(i => input[i]) 

на данный момент, у вас есть это:

indexes.Select(i => input[i]); 

И вы можете добавить его в список, как это:

chars.AddRange(indexes.Select(i => input[i])); 

Но если у вас есть частный случай, когда список пуст (например, потому что вы только что создали его) , то теперь вы можете быть глядя на что-то вроде этого:

var chars = new List<char>(); 
chars.AddRange(indexes.Select(i => input[i])); 

Это также очень распространенный случай и есть метод ToList() расширение, которое может упростить его еще больше. Этот метод в основном перечисляет запрос и создает список для вас, избавляя Вас от вызова конструктора и Add или AddRange методов:

var chars = indexes.Select(i => input[i]).ToList(); 
+0

Спасибо за объяснение, я только начал изучать LINQ. – BladeMight

3
chars = 
    indexes 
    .Select(index => input[index]) 
    .ToList(); 

Это будет выброшено, если один из индексов выходит за пределы диапазона, но так будет и исходный код. Кроме того, вам может потребоваться выполнить, если вам нужно сохранить то, что уже было в chars.

+1

Это было так просто, спасибо! – BladeMight

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