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
。要获得 KeyValuePair
s,我会使用
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)
开始。
所以下面是我目前拥有的代码(它不起作用,因为最后一个块看到数组未定义,这是为了显示我想做什么)
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
。要获得 KeyValuePair
s,我会使用
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)
开始。