2012-05-28 13 views
6

ऐसा लगता है कि यह एक आसान काम होना चाहिए लेकिन मैं यह नहीं समझ सकता कि LINQ के साथ ऐसा कैसे किया जाए। एकमात्र जानकारी जिसे मैं अब तक ढूंढने में सक्षम हूं, राउंड रॉबिन टूर्नामेंट प्रारूप के बारे में है, जो कि मैं बाद में नहीं हूं। मैं गलत खोज रहा हूँ। निम्न सूची को देखते हुए:"राउंड रॉबिन" द्वारा LINQ ऑर्डर

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" }; 

मैं इस (LINQ अधिमानतः उपयोग करते हुए) को सॉर्ट कैसे कर सकते हैं ताकि वह "राउंड रोबिन" क्रम में बाहर आता है, कि है, दोहराता से पहले एक बार प्रत्येक अद्वितीय आइटम का चयन करें। तो उपरोक्त सूची इस तरह बाहर आ जाएगा (यह महत्वपूर्ण है अगर यह वर्णमाला के क्रम में बाहर आता है नहीं है, भले ही इस सूची करता है):

var sorted [] { "apple", "banana", "candy", "fruit", "apple", "banana", "banana" }; 

मैं जानता हूँ कि मैं मुश्किल तरीके से इस पर पुनरावृत्ति करके ऐसा कर सकते हैं, मैं बस कुछ आसान की उम्मीद कर रहा था। क्या किसी के पास कोई अंतर्दृष्टि है कि यह कैसे करें? अग्रिम में धन्यवाद!

+0

क्या आप समझा सकते हैं कि "राउंड-रॉबिन" सॉर्टिंग द्वारा आपका क्या मतलब है? – mattytommo

+0

उसका मतलब है "राउंड-रॉबिन" सॉर्टिंग http://en.wikipedia.org/wiki/Round-robin – Likurg

उत्तर

8
var sorted = items.GroupBy(s => s) 
    .SelectMany(grp => grp.Select((str, idx) => new { Index = idx, Value = str })) 
    .OrderBy(v => v.Index).ThenBy(v => v.Value) 
    .Select(v => v.Value) 
    .ToArray(); 
+0

कंधे ठीक से कॉपी करने के लिए सीखना चाहिए। इसे स्वीकार करें, यह काम करता है। – Alex

+1

अच्छा दृष्टिकोण, मुझे यह पसंद है! – HugoRune

+0

आप सर भयानक हैं। यह पूरी तरह से काम करता है। धन्यवाद! मुझे बदलने की ज़रूरत है कि मुझे अपनी परियोजना के लिए ग्रुपबी को वास्तविक अद्वितीय आइटम द्वारा समूहित करने के लिए समूह किया गया था, बाकी का शाब्दिक रूप से कॉपी-पेस्ट था। एक बार फिर धन्यवाद! – Eric

0

मैं था इस बार, ऊपर कोड खोदा:

//Originially written for lists, all you need is prepend a .ToList() where needed to apply this to an array 
List<string> src = new List<string> { "string1", "string2" }; //source 
List<string> dst = new List<string>(); 

dst.AddRange(src.Distinct()); 
dst.ForEach(d => src.RemoveAt(src.FindIndex(i => i.Equals(d)))); //remove the first occurrence of each distinct element 
dst.AddRange(src); 
0

बस देखा कि दो जवाब ऊपर पॉप जब मैं इस लिख रहा था; ओह ठीक है, यहाँ एक और तरीका है:

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" }; 

var uniqueItems = items.Distinct().OrderBy(item => item); // alphabetical orderBy is optional 

var duplicateItems = items 
        .GroupBy(item => item) 
        .SelectMany(group => group.Skip(1)) 
        .OrderBy(item => item); // alphabetical orderBy is optional; 

var sorted = uniqueItems.Append(duplicateItems).ToArray(); 
संबंधित मुद्दे