2013-01-21 56 views
1

編譯錯誤: 「這個名字‘B’不會在目前情況下存在」編譯錯誤使用LINQ排序代碼使用列表<T>

代碼:

List<PositionValues> list = new List<PositionValues>(); 
    PositionValues item1 = new PositionValues(); 
    item1.Position = 2; 
    item1.Value = 44; 
    list.Add(item1); 

    PositionValues item2 = new PositionValues(); 
    item2.Position = 1; 
    item2.Value = 33; 
    list.Add(item2); 


    PositionValues item3 = new PositionValues(); 
    item3.Position = 1; 
    item3.Value = 22; 
    list.Add(item3); 


    var resultList = from b in list 
        group b by b.Position into g 
        orderby b.Value select b; 

上面的代碼依賴於這個結構:

public struct PositionValues 
{ 
    /// <summary> 
    /// The position. 
    /// </summary> 
    public int Position; 

    /// <summary> 
    /// The position. 
    /// </summary> 
    public double Value; 
} 

我希望能得到以下排序順序:

resultList[0] {1, 22} 
resultList[1] {1, 33} 
resultList[2] {2, 44} 

「位置」在括號中第一個,「值」在第二個。

+3

一旦你編組,你有* *組,不個別項目 - 所以通過單個項目值排序組沒有任何意義。目前還不清楚你想要達到什麼(也不知道你爲什麼使用可變結構......) –

+0

喬恩 - 感謝你的提問。我的首要任務是獲得指定的物品。 – Buck

+0

你的意思是在每組中嗎?如果您有{2,35}的價值,該怎麼辦? –

回答

3

根據您發佈的預期結果,您不需要使用group by

你想更重要的是這樣的:

var result = list.OrderBy(x => x.Position).ThenBy(x => x.Value); 
+0

完美答案,非常明確。謝謝! – Buck

+0

如果您對使用ToList()進行排序有任何想法,那麼效果會很好(替代方法)。再次感謝您的答覆。 – Buck

0

您已將b加入組g,因此現在使用g。在分組到g之前,您還必須按b進行排序。

var resultList = from b in list orderby b.Value group b by b.Position into g select g; 
+0

感謝您的解決方案! – Buck

1

或者,如果你想查詢的風格,

var query = 
    from b in list 
    orderby b.Position, b.Value 
    select b; 
+0

這和第一個答覆一樣好,但只能標記一個答案。非常感謝。這是一個很好的選擇。 – Buck