Создать список кортежей из списка с помощью LINQ
Я пытаюсь создать список кортежей из списка, используя LINQ, но не могу понять, как это сделать. У меня есть различные данные во внешнем файле, которые я читаю, используя стандартные методы в List<Single>
Затем мне нужно превратить это в списки групп последовательных элементов этого списка (которые могут иметь переменное количество элементов в группах). Чтобы сформулировать это по-другому:
List<Single> with n elements goes to List<Tuple<Single, Single>> with (n/2) elements
или же
List<Single> with n elements goes to List<Tuple<Single, Single, Single>> with (n/3) elements
Я не мог понять, как это сделать с помощью LINQ, поэтому я вернулся к циклу for, например, так:
For i As Integer = 0 To CType(coords.Item2.Count / 3, Integer) Step 3
normalList.Add( _
New Tuple(Of Single, Single, Single)( _
coords.Item2.Item(i), _
coords.Item2.Item(i + 1), _
coords.Item2.Item(i + 2) _
) _
)
Next i
РЕДАКТИРОВАТЬ: Меня совсем не волнует универсальное решение, меня интересует, можно ли делать подобные вещи с помощью LINQ. Кажется, что это за пределами оценки того, для чего он предназначен, но мне не хватает чувства, чтобы знать, правда ли это.
Мой вопрос заключается в том, возможно ли выполнить вышеуказанный тип задачи с помощью LINQ. Я бился в пользовательском интерфейсе и Google, но пришел пустым!
2 ответа
Это может быть достигнуто (пример для Tuple<Single, Single>
) и следующее решение не очень сложно, но использование цикла является более понятным и - в случае данного конкретного решения - более эффективным (список ввода перечисляется дважды). Код в C#, не знаю VB
var even = inputList.Where((elem, ind) => ind % 2 == 0);
var odd = inputList.Where((elem, ind) => ind % 2 == 1);
var outputList = even.Zip(odd, (a, b) => new Tuple<Single, Single>(a, b)).ToList();
Может быть, это кому-то поможет.
var pairs = from p in TheListOfAllLists select (
new Tuple<string, string>( p.ParameterName,p.Value.ToString()));