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

C# C-如何使用两个foreach循环的结果创建KeyValuePair?,c#,arrays,linq,loops,key-value,C#,Arrays,Linq,Loops,Key Value,下面是我目前拥有的代码,它不起作用,因为最后一个块看到数组是一个未定义的,它是为了显示我想要做什么 IEnumerable<string> sponsorshipQuery1 = from runner1 in venueQuery6.Descendants("Runner") where (int)runner1.Element("Sponsorship") > 0 orderby (int)runner1.Element("Sponsorship") desce

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

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查询,所以我混合使用查询语法和=>语法的原因是因为我学习了查询语法,但我也在尝试在internet上找到的代码。

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

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,我会使用

但在您的特定示例中,由于您有以下共同来源:

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

我只需要选择new KeyValuePairrunner1.ElementFirstname.Value,runner.ElementConsponsibilation.Value作为开始。

new KeyValuePair:您需要指定SADLY非常有趣的。。。遗憾的是,当我有多个枚举项需要手动枚举时,我通常会同时使用GetEnumerator和MoveNext。。。我从来没有想过混合使用foreach+MoveNextThanks来指出错误,@xanatos,是的,KeyValuePair可以像Tuple那样创建一个,但是它作为一个Tuple已经被滥用了。谢谢!我很感激你教我如何做双foreach,我之前一直在努力想我该怎么做。我不知道你可以使用带大括号的select new,据我所知,我只选择了一个值。这很有效,谢谢@TerminalGuy它是单个值,但该单个值可以包含多个值:
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