2013-06-03 4 views
3

Я пытаюсь создать список кортежей из списка с помощью LINQ, но не могу решить, как это сделать. У меня есть разные данные во внешнем файле, который я читаю в разделах с использованием стандартного метода в List<Single>. Затем мне нужно включить это в списки групп последовательных элементов этого списка (которые могут иметь переменное число элементов в группах). Чтобы сформулировать это по-другому:Создать список кортежей из списка с помощью LINQ

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 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 

EDIT: Я вообще не беспокоит общее решение, я заинтересован, если это возможно, чтобы сделать этот тип вещи с помощью LINQ. Похоже, что он находится вне оценки того, для чего он предназначен, но мне не хватает чувства, чтобы знать, верно ли это.

Мой вопрос в том, возможно ли выполнить вышеуказанный тип задачи с помощью LINQ. Я набросился в пользовательском интерфейсе и Google, но вышел пустым!

+0

Невозможно на самом деле сделать это в строго типизированной среде, отличной от написания кода для каждого возможного появления 'n'. (Как и многие типы «Tuple»). Вы либо должны использовать динамику, либо рисковать в F #, где это будет арахис. (Но для этого потребуется интерфейс VB с динамикой). –

+0

@GertArnold Я не слишком беспокоюсь об общем решении - я пытаюсь выяснить, можно ли использовать LINQ для выполнения задачи в руке для любого из возможных примеров. Я подозреваю, что смогу сделать решение более общим, как только я знаю, как сделать один пример. Я отредактировал свой вопрос, чтобы сделать это более ясным. Спасибо! – GHC

+1

_ вне оценки того, для чего он предназначен. Правильно. LINQ отлично подходит для операций set (Where, Except, Union, ...), а не для последовательных файлов. Можно написать [методы расширения] (http://stackoverflow.com/a/6852288/861716), которые вырезают IEnumerable в куски определенного количества элементов, но вы можете утверждать, что это все еще LINQ. Обычно классический 'For/ForEach' выглядит гораздо менее сложным. –

ответ

4

Это может быть достигнуто (пример для 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(); 
+0

Ты качаешь. Я не знал о расширении zip. Спасибо! – GHC

4

Может быть, это поможет кому-то.

var pairs = from p in TheListOfAllLists select (
new Tuple<string, string>(p.ParameterName,p.Value.ToString())); 
+0

Это конечно, спасибо. – markau

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