2012-11-16 9 views
7

मैं ऑब्जेक्ट नाम संपत्ति का उपयोग कर वस्तुओं की एक सामान्य सूची को सॉर्ट करने का प्रयास कर रहा हूं। मैं LINQ का उपयोग कर रहा है और निम्न भाव नहीं है काफी काम:जेनरिक सूची पर लिंक आदेश ऑर्डर पूरी तरह से वर्णानुक्रम सूची नहीं देता

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 (यूआरएल लिंक के लिए खेद है, लेकिन ऐसा किसी भी तरह मुझे मेरे खाते में नहीं पहुंच गया है और मैं जाहिरा तौर पर इस नए के साथ छवियों पोस्ट नहीं कर सकते हैं)।

सूचीबॉक्स लगभग वर्णमाला है लेकिन काफी नहीं है। किसी कारण से "aa" और "aaaa" आखिरी बार आता है। कारण क्या हो सकता है, और इसे कैसे हल किया जाए?

अग्रिम धन्यवाद।

जब दृश्य स्टूडियो में प्रवेश किया और मार डाला अनुरोध

इस कोड, द्वारा विस्तार:

a 
bb 
c 
Calculator 
ccc 
Projects 
aa 
aaa 

यह सही ढंग से हल नहीं किया गया है:

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

मेरा पीछा उत्पादन देता है: पहला "ए" सही है, लेकिन बाद में "aa" और "aaa" प्रविष्टियां सूची के नीचे भेजी जाती हैं।

मैं चरित्र सेट और एन्कोडिंग के बारे में ज्यादा जानकारी नहीं देता हूं, इसलिए संभवतः मैं यहां एक रूकी गलती कर रहा हूं। लेकिन उस मामले में मुझे यह नहीं पता कि यह क्या हो सकता है, और मैं थोड़ा परेशान होगा कि क्यों पहला "ए" सही तरीके से आदेश दे रहा है, लेकिन दूसरा और तीसरा "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 सुझाव, समस्या OrderBy विधि के लिए StringComparer.InvariantCultureIgnoreCase comparer की आपूर्ति करके हल किया गया था।

आगे के शोध पर, ऐसा लगता है कि डेनमार्क संस्कृति (दा-डीके) का उपयोग करते समय FindAll और OrderBy विधियों (संभवतः अन्य) में समस्याएं होती हैं। असफल होने वाली अन्य विधियां या संस्कृतियां हो सकती हैं, लेकिन दा-डीके संस्कृति और FindAll + OrderBy विधियां निश्चित रूप से इरादे से काम नहीं कर रही हैं।

ऑर्डरबी विधि में इस धागे (गलत क्रम) में वर्णित समस्या है। FindAll विधि में एक समान, बहुत अजीब समस्या है: मान लें कि हमारे पास प्रविष्टियों की एक सूची है: ए, aa, aaa और aaaa। FindAll (x => x.StartsWith ("a") का उपयोग करते समय, यह केवल "ए" नहीं, aaa और aaaa लौटाएगा। यदि स्टार्टविथ ("एए") का उपयोग करते हैं, तो यह सही ढंग से aa, साथ ही aaa और aaaa भी मिलेगा। स्टार्टविथ ("aaa") का उपयोग करते समय इसे फिर से नहीं मिलेगा, केवल aaa! यह ढांचे में एक बग प्रतीत होता है।

+0

सुनिश्चित करें कि आप बाद में कुछ आइटम नहीं जोड़ते हैं। अर्थात। सत्यापित करें 'query.Count() 'सूची में शब्दों की संख्या के बराबर है। यह भी सुनिश्चित करें कि आप केवल अंग्रेज़ी वर्णों का उपयोग करें। –

+0

यदि आप Winforms का उपयोग कर रहे हैं, तो आप इसका उपयोग करने का प्रयास कर सकते हैं: listBox1.Sorted = true; लिनक ऑर्डरबी के बजाय यह देखने के लिए कि क्या यह समस्या हल करती है – RAS

+1

कोई छवि लिंक पोस्ट करने के बजाय, क्या आप अपना केस दिखाकर एक साधारण उदाहरण पोस्ट कर सकते हैं? –

उत्तर

6

आप की जगह की कोशिश कर सकते हैं:

IEnumerable<Word> query = words.OrderBy(x => x.Name.ToLower()).ToList(); 

... के साथ:

IEnumerable<Word> query = words.OrderBy(x => x.Name, 
    StringComparer.InvariantCultureIgnoreCase); 

वहाँ बहुत कम मौका है कि यह एक अजीब संस्कृति मुद्दा है।

+1

+1। मुझे लगता है कि इस बिंदु पर यह एकमात्र व्यावहारिक स्पष्टीकरण है - ओपी की संस्कृति तुलना दूर है ... –

+0

वास्तव में यह चाल है। मुझे समझ में नहीं आता कि क्यों, जैसा कि आप डगलस कहते हैं, कुछ अजीब संस्कृति मुद्दे। मैं किसी विशेष फंकी संस्कृति का उपयोग नहीं कर रहा हूं, इसलिए यह बहुत अजीब है। लेकिन यह काम किया, तो मुझे लगता है कि मैं अब बिस्तर पर जा सकता हूं, और पत्नी को अच्छी कृपा में वापस लाने की कोशिश करता हूं। बहुत बहुत धन्यवाद! –

+0

'CultureInfo.CurrentCulture' और' CultureInfo.CurrentUICulture' के मानों की जांच करने का प्रयास करें। लेकिन पहले एक अच्छी रात है :-) – Douglas

2

सबसे अधिक संभावना है कि आप "ए" कुछ अलग (गैर ASCII) चरित्र हैं। यह देखने के लिए कि यह "ए" जैसा ही है, यह देखने के लिए वर्ण कोड (int)("a"[0]) देखें।

अगर यह मामला है तो सॉर्टिंग के साथ गलत नहीं है - ठीक करने के लिए कुछ नहीं (शायद आपके डेटा को बेहतर ढंग से समझें)।

+0

सभी प्रविष्टियों को कोड के माध्यम से पाठ में जोड़ा गया है, जैसे: ListObj.Add ("a"), ListObj.Add ("aaaa"), ListObj.Add ("कैलकुलेटर"), ListObj.Add ("bbb") आदि –

+1

@ user1830478, मुझे यकीन नहीं है कि आप अपनी टिप्पणी के साथ क्या कहने की कोशिश कर रहे हैं। क्या आप यह कह रहे हैं कि सी # स्रोत कोड में केवल ASCII वर्ण (स्पष्ट रूप से झूठे) हो सकते हैं? –

+0

कंसोल या संदेशबॉक्स द्वारा प्रिंट करने का प्रयास करें, 'MessageBox.Show (string.Format ("{0}", (int)' a ')); और देखें कि इसकी ** 9 ** ** कॉपी और पेस्ट के साथ – S3ddi9

5

निम्नलिखित कोड आउटपुट अपेक्षित परिणाम:

class Word 
{ 
    public Word(string str) 
    { 
     Name = str; 
    } 

    public string Name { get; private set; } 
} 

public static void Main(string[] args) 
{ 
    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 
aa 
aaa 
bb 
c 
Calculator 
Projects 

अद्यतन: ठीक है, रहस्य सुलझ (एक तरह से)। आप अपने कोड से पहले निम्नलिखित को निष्पादित हैं:

var cultureInfo = new CultureInfo("da-DK"); 
Thread.CurrentThread.CurrentCulture = cultureInfo; 
Thread.CurrentThread.CurrentUICulture = cultureInfo; 

आप प्राप्त "गलत" उत्पादन:

a 
bb 
c 
Calculator 
Projects 
aa 
aaa 

जाहिर डेनिश lexicographical तुलना के लिए नियम अलग हैं।

ध्यान दें कि यह सक्रिय स्थान पर बहुत निर्भर है: यहाँ एक विवरण मैं नेट (http://stackoverflow.com/questions/4064633/string-comparison-in-java) पर पाया गया है। उदाहरण के लिए, यहां डेनमार्क में हमारे पास एक चरित्र "å" है जिसे "एए" के रूप में वर्णित किया जाता था और यह दो एकल से बहुत अलग है। इसलिए डेनिश सॉर्टिंग नियम दो लगातार एक के समान रूप से "एए" का इलाज करते हैं, जिसका अर्थ यह है कि यह ज़ेड के बाद जाता है। इसका मतलब यह भी है कि डेनिश शब्दकोशों को अंग्रेजी या स्वीडिश लोगों से अलग किया जाता है।

+0

यह बहुत विषम है। मैंने कक्षा परिभाषा में देखा है और मैं वर्ड क्लास में स्ट्रिंग पैरामीटर को स्ट्रिंग पैरामीटर पास करने के अलावा कन्स्ट्रक्टर में कुछ भी नहीं करता हूं। –

+0

मैंने अभी वर्ड ऑब्जेक्ट्स के बजाय सादे तारों का उपयोग करने की कोशिश की है - अभी भी वही आउटपुट। लेकिन ऐसा लगता है कि कई लोगों ने एक ही कोड की कोशिश की है, सही परिणाम के साथ, इसलिए मैं फंस गया हूँ! –

+0

मैंने आपके उदाहरण verbatim की प्रतिलिपि बनाने का भी प्रयास किया, सही क्रम क्रम भी नहीं दिया। बहुत अजीब। –

संबंधित मुद्दे