我正在嘗試使用對象名稱屬性對對象的泛型列表進行排序。我使用LINQ和下面的表達式完全不是那麼回事:Linq OrderBy在泛型列表上返回不完全按字母順序排列的列表
var query = possibleWords.OrderBy(x => x.Name.ToLower()).ToList();
foreach (Word word in query) //possibleWords.OrderBy(word => word.Name))
{
listWords.Items.Add(word.Name);
}
「查詢」現在應該包含訂購的商品清單,如果我理解正確和項目應該被添加到列表框中命名listWords。
但是輸出是這樣的:
http://screencast.com/t/s1CkkWfXD4(遺憾的URL鏈接,但這麼莫名其妙地把我鎖我的賬戶,我顯然不能用這個新發布的圖像)。
列表框幾乎按字母順序排列,但不完全。出於某種原因,「aa」和「aaaa」是最後一個。可能是什麼原因,以及如何解決它?
在此先感謝。
闡述的要求
此代碼,在Visual Studio中輸入並執行時:
List<Word> words = new List<Word>();
words.Add(new Word("a"));
words.Add(new Word("Calculator"));
words.Add(new Word("aaa"));
words.Add(new Word("Projects"));
words.Add(new Word("aa"));
words.Add(new Word("bb"));
words.Add(new Word("c"));
IEnumerable<Word> query = words.OrderBy(x => x.Name.ToLower()).ToList();
foreach (Word word in query)
{
Console.WriteLine(word.Name);
}
給我下面的輸出:
a
bb
c
Calculator
ccc
Projects
aa
aaa
這是不正確排序:第一個「a」是正確的,但隨後的「aa」和「aaa」條目被髮送到列表的底部。
我不太瞭解字符集和編碼,所以我可能在這裏犯了一個菜鳥錯誤。但是在這種情況下,我不認識到可能是什麼,對於爲什麼第一個「a」正確排序,我會有點困惑,但第二個和第三個「aa」和「aaa」不是!
進一步闡述 - 字類
[Serializable()]
public class Word
{
[System.Xml.Serialization.XmlAttribute("Name")]
public string Name { get; set; }
public Word(string name)
{
Name = name;
}
public Word() { } //Parameter less constructor neccessary for serialization
}
原因和解決
像@Douglas建議,這個問題是通過提供StringComparer.InvariantCultureIgnoreCase比較器的排序依據的方法解決。
在進一步的研究,似乎都在的FindAll和排序依據的方法(可能還有其他人)使用丹麥文化(DA-DK)時遇到問題。可能有其他方法或文化失敗,但da-DK文化和FindAll + OrderBy方法肯定無法按預期工作。
OrderBy方法存在此線程中描述的問題(錯誤排序)。 FindAll方法有一個類似的非常奇怪的問題:假設我們有一個條目列表:a,aa,aaa和aaaa。當使用FindAll(x => x.StartsWith(「a」))時,它只會返回「a」NOT aa,aaa和aaaa。如果使用StartsWith(「aa」),它將正確地找到aa以及aaa和aaaa。當使用StartWith(「aaa」)時,它將再次找不到aaaa,只有aaa!這似乎是該框架中的一個錯誤。
請確保您稍後不要添加一些項目。即驗證'query.Count()'等於列表中的字數。另外請確保您只使用英文字符。 –
如果你使用winforms,你可以嘗試使用: listBox1.Sorted = true;而不是linq orderby,看看它是否可以解決問題 – RAS
而不是張貼圖片鏈接,你可以發佈一個簡單的例子顯示你的情況? –