C# - 如何使用两个 foreach 循环的结果创建 KeyValuePair?

C# - How to create a KeyValuePair with the result of two foreach loops?

所以下面是我目前拥有的代码(它不起作用,因为最后一个块看到数组未定义,这是为了显示我想做什么)

IEnumerable<string> sponsorshipQuery1 =
  from runner1 in venueQuery6.Descendants("Runner")
  where (int)runner1.Element("Sponsorship") > 0
  orderby (int)runner1.Element("Sponsorship") descending
  select runner1.Element("Firstname").Value;

IEnumerable<string> sponsorshipQuery2 =
  from runner1 in venueQuery6.Descendants("Runner")
  where (int)runner1.Element("Sponsorship") > 0
  orderby (int)runner1.Element("Sponsorship") descending
  select runner1.Element("Sponsorship").Value;

string[] nameArray;
string[] moneyArray;

foreach (string name in sponsorshipQuery1)
{
  nameArray = sponsorshipQuery1
    .OfType<object>()
    .Select(o => o.ToString()).ToArray();
}

foreach (string money in sponsorshipQuery2)
{
  moneyArray = sponsorshipQuery2
    .OfType<object>()
    .Select(o => o.ToString())
    .ToArray();
}

Console.WriteLine("All sponsorship money raised in descending order:");
for (int i = 0; i < nameArray.Length; i++)
{
  Console.WriteLine(nameArray[i] + " has raised £" + moneyArray[i]);
}

理想情况下,我希望能够在底部执行for循环。我想替换两个 foreach 循环并使它们成为 KeyValuePairs,但我不知道该怎么做。

我也是使用 Linq 查询的新手,所以我混合使用查询语法和 => 语法的原因是因为我学习了查询语法,但我也在尝试我在互联网。

从您的示例代码看来,您可以在一个查询中获取两个值,并将它们保存为匿名类型:

var results = from runner1 in venueQuery6.Descendants("Runner")
                  where (int)runner1.Element("Sponsorship") > 0
                  orderby (int)runner1.Element("Sponsorship") descending
                  select new { 
                     Name = runner1.Element("Firstname").Value,
                     Amount = runner1.Element("Sponsorship").Value
                  };

然后你可以遍历这些结果:

foreach (var result in results)
{
    Console.WriteLine(result.Name + " has raised £" + result.Amount);
}

串联迭代两个序列的最高级别方法是 Zip。要获得 KeyValuePairs,我会使用

sponsorshipQuery1.Zip(sponsorshipQuery2, (k, v) => new KeyValuePair<string, string>(k, v))

虽然我可能根本不会使用 KeyValuePair,但我的任务或匿名类型更具体,除非我真的关心它作为键值对。

迭代您已经介绍过的两个数组。要对两个无法(必须)编制索引的 IEnumerable<T> 执行双 foreach,需要至少分解其组件 MoveNext() 和 [=19= 的循环之一]

using (var en1 = sponsorshipQuery1.GetEnumerator())
{
  foreach(var item2 in sponsorshipQuery2)
  {
    if (!en1.MoveNext())
    {
      break;
    }
    var item1 = en.Current;
    // Do something with the two items here. E.g.
  }
}

在你的特定例子中,因为你有一个共同的来源:

from runner1 in venueQuery6.Descendants("Runner")
  where (int)runner1.Element("Sponsorship") > 0
  orderby (int)runner1.Element("Sponsorship") descending

我只是 select new KeyValuePair<string, string>(runner1.Element("Firstname").Value, runner.Element("Sponsorship").Value) 开始。