Enumerable.Zip более 2 коллекций?

 var productNameTags = document.DocumentNode.SelectNodes(textBox3.Text);
                var priceTags = document.DocumentNode.SelectNodes(textBox2.Text);
                var codeNameAndPrice = productNameTags.Zip(priceTags, (n, w) => new { productNameTags = n, priceTags = w });
                int counter = 1;
                if (codeNameAndPrice != null)
                {
                    foreach (var nw in codeNameAndPrice)
                    {
                         label1.Visible = true;
                         label1.Text += counter + ". " + nw.productNameTags.InnerHtml + " - " + nw.priceTags.InnerHtml + "\n";
                    }
                }

У меня есть этот код, который просматривает теги html и распечатывает название продукта и цену с веб-сайта и распечатывает вот так, используя .Zip:

  1. Бейсбол - 5 фунтов стерлингов
  2. Футбол — 10 фунтов стерлингов.
  3. Игрушечная машинка — £15.00

Есть ли простой способ добавить три или более переменных для объединения, используя другой метод?

e.g.

  1. Бейсбол — 5 фунтов стерлингов — 1123
  2. Футбол - 10 фунтов стерлингов - 1124
  3. Игрушечная машинка — 15 фунтов стерлингов — 1125

Заранее спасибо!


person TeaAnyOne    schedule 06.01.2016    source источник
comment
Вы можете связать команды Zip - откуда берутся 1123, 1124 и 1125?   -  person D Stanley    schedule 06.01.2016
comment
Возможный дубликат Заархивировать N IEnumerable‹T вместе? Перебирать их одновременно?   -  person Reg Edit    schedule 06.01.2016
comment
@RegEdit желаемый результат этих двух вопросов отличается, поэтому я не уверен, что он должен дублироваться ... С другой стороны, ответы могут быть адаптированы для ответа на этот вопрос ... Так что держите свой золотой молоток в кармане, а не закрывайте .   -  person Alexei Levenkov    schedule 06.01.2016


Ответы (2)


Я не думаю, что вы можете легко сделать это с помощью .Zip (за исключением нескольких уровней zip?), но вы можете сделать это динамически:

var names = new[] { "Baseball", "Football", "Toy Car" };
var prices = new[] { 5.0M, 10.0M, 15.0M };
var ids = new[] { 1123, 1124, 1125 };
var products = names
    .Select((name, index) => new { Name = name, Price = prices[index], Id = ids[index] });
person TVOHM    schedule 06.01.2016
comment
Хорошая мысль о возможности использовать индекс для слияния (для последовательностей одинаковой длины). Обратите внимание, что предложение по индексации отлично работает с массивом/списком, но для списков узлов Xml/Html это, вероятно, будет O(n), а не O(1) для каждого доступа к индексу, что делает общий код O(n^2) вместо На). - person Alexei Levenkov; 06.01.2016

No.

Вы можете связать вызовы Zip, или вы можете написать (или найти) метод расширения/помощника, который будет проходить несколько источников параллельно, подобно Zip, чтобы обеспечить функциональность, которую вы ищете.

В вашем конкретном случае рассмотрите возможность повторения некоторых родительских узлов и выбора отдельных дочерних узлов относительно родителя (при условии, что все узлы для определенного элемента являются дочерними элементами одного «родительского» узла).

person Alexei Levenkov    schedule 06.01.2016