2017-04-11 23 views
0

所以下面是我目前擁有的代碼(這是行不通的,因爲最後一塊看到數組的定義,它是顯示我想要做的)C# - 如何創建一個KeyValuePair與兩個foreach循環的結果?

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查詢,所以我之所以有查詢語法的混合物=>語法是因爲我被教導的查詢語法,但我也想代碼中,我就發現互聯網。

回答

6

這似乎從你的示例代碼,你可以只得到一個查詢這兩個值,並將其保存在一個匿名類型:

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); 
} 
+0

我不知道,你可以使用'用括號選擇new',從我瞭解到我只選擇單個值。這工作,謝謝! –

+0

樂意幫忙.. – stuartd

+1

@TerminalGuy它*是一個單值,但是這個單值可以包含多個:) –

2

串聯迭代兩個序列的最高級別的方法是Zip。爲了得到KeyValuePair的I會使用

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

雖然我可能不會使用KeyValuePair所有,但更具體的我的任務或匿名類型的東西,除非我真正關心它作爲一個鍵值對。

遍歷你已經涵蓋兩個數組。要在做雙不了的(必須)索引一個需要環路的至少一個分解爲組成它的MoveNext()Current

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)開始。

+1

'new KeyValuePair':你需要指定''(很遺憾) – xanatos

+0

非常有趣...不得不說,(可惜)當我有多個枚舉手動枚舉我通常'GetEnumerator()'和'MoveNext'都...我從來沒有想過混合foreach + + MoveNext' – xanatos

+0

感謝您指出滑,@xanatos,是'KeyValuePair'可以用一個'Create'像'Tuple'有做,但後來它被濫用作爲一個元組足夠的,因爲它是。 –