मत पूछो कैसे और क्यों ... ^^
list.Sort(); // In case the list is not already sorted.
var length = list.Count;
var result = Enumerable.Range(0, length)
.Select(i => length - 1 - 2 * i)
.Select(i => list[Math.Abs(i - (i >> 31))])
.ToList();
ठीक है, इससे पहले कि मैं भूल जाता हूं कि यह कैसे काम करता है, यहां आप जाते हैं।
उदाहरण के लिए 6 आइटम वाली एक सूची को इसके लिए पुन: व्यवस्थित किया जाना चाहिए; सबसे लंबी स्ट्रिंग इंडेक्स 5 पर है, जो कि पूर्व निर्धारित सूची के इंडेक्स 0 पर सबसे कम है।
5 3 1 0 2 4
हम Enumerable.Range(0, length)
उपज
0 1 2 3 4 5
के साथ शुरू तो हम i => length - 1 - 2 * i
लागू
5 3 1 -1 -3 -5
उपज और हम गैर नकारात्मक हिस्सा सही है। अब ध्यान दें कि i >> 31
एक अंकगणित बाएं शिफ्ट है और साइन बिट को सभी बिट्स में कॉपी करेगा। इसलिए गैर-ऋणात्मक संख्या 0 उत्पन्न होती है जबकि ऋणात्मक संख्याएं उपज होती हैं -1। यही कारण है कि बदले में इसका मतलब घटाकर i >> 31
गैर नकारात्मक संख्या में बदलाव नहीं होगा लेकिन ऋणात्मक संख्याओं में 1 जोड़
5 3 1 0 -2 -4
उपज और अब हम अंत में Math.Abs()
लागू करते हैं और
5 3 1 0 2 4
जो वांछित परिणाम प्राप्त होता है। यह विषम लंबाई की सूचियों के लिए समान रूप से काम करता है।
स्रोत
2014-05-10 22:25:56
प्रभावशाली उत्तर। – chad
लेकिन कुछ भी नहीं जो आप उत्पादन कोड में रखना चाहते हैं। या शायद केवल * बहुत * टिप्पणियों के साथ। –