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