मेरे पास नीचे की तरह एक स्ट्रिंग है: -

string[] things = new string[] { "1", "10", "2", "1_1", "2_1","3_1" };

वांछित आउटपुट है:

"1",
"1_1",
"2",
"2_1",
"3_1",
"10",

LINQ का उपयोग करके मैं इसे कैसे प्राप्त कर सकता हूं?

3
Digambar 20 पद 2017, 12:08

5 जवाब

सबसे बढ़िया उत्तर

यदि वह प्रारूप सख्त है तो आप पर पार्स कर सकते हैं Version और उसके द्वारा आदेश दें:

string[] orderedThings = things
   .Select(t => new { Thing = t, Numbers = (t + "_0").Split('_') })
   .Where(x => x.Numbers.All(s => s.All(char.IsDigit)))
   .Select(x => new { x.Thing, VersionStr = String.Join(".",x.Numbers.Take(4)) })
   .OrderBy(x => new Version(x.VersionStr))
   .ThenBy(x => x.Thing)
   .Select(x => x.Thing)
   .ToArray();

t + "_0" ट्रिक यह सुनिश्चित करने के लिए जरूरी थी कि सिंगल डिजिट को भी पार्स किया जा सके। एक संस्करण को कम से कम एक प्रमुख और अमीनो भाग की आवश्यकता होती है। यह "काम करता है" भी अगर 4 से अधिक टोकन (प्रमुख, मामूली, निर्माण, और संशोधन) हैं। फिर केवल पहले 4 को Version इंस्टेंस को इनिशियलाइज़ करने के लिए लिया जाता है।

1
Tim Schmelter 20 पद 2017, 12:53

हां, आप प्रत्येक भाग को _ से विभाजित कर सकते हैं और पहले स्ट्रिंग भाग को पूर्णांक में बदल सकते हैं। बाद में छांटते समय यह सुनिश्चित करेगा कि 10, 2 से पहले नहीं है। फिर दूसरे स्टेप में आप इसे लास्ट नंबर के हिसाब से ऑर्डर करें

string[] things = new string[] { "5_3", "5_2", "1", "10", "2", "1_1", "2_1", "1_2", "3_1" };

string[] ordered = things.OrderBy(x=>Convert.ToInt32(x.Split('_').First())).                       
                           ThenBy(x=>Convert.ToInt32(x.Split('_').Last())).ToArray();

आउटपुट:

enter image description here

संपादित करें: यहां ThenBy के दस्तावेज़ीकरण का लिंक दिया गया है सूचनात्मकता के लिए;)

5
Mong Zhu 20 पद 2017, 13:09

इस बारे में क्या?

string[] strings = new string[] { "1", "10", "2", "1_1", "2_1", "3_1" };

var ordered = from str in strings
                let weight = double.Parse(str.Replace("_", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator))
                let pair = new { Weight = weight, OriginalString = str }
                orderby pair.Weight
                select pair.OriginalString;
2
SuperJMN 20 पद 2017, 12:20

आप OrderBy जो आपको अपनी खुद की कुंजी बनाने की अनुमति देता है और शायद अपना खुद का तुलनाकर्ता निर्दिष्ट करता है। ऐसा लगता है कि आप _ को दशमलव विभाजक के रूप में देखना चाहते हैं।

एक त्वरित और गंदा तरीका _ को दशमलव विभाजक से बदलना होगा, उदाहरण के लिए:

var decSeparator=CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;

var orderedThings=things.OrderBy(thing=>double.Parse( thing.Replace("_",decSeparator)) )
                        .ToArray();

यह त्वरित और गंदा है क्योंकि यह मानता है कि _ केवल एक बार दिखाई देता है। यदि _ कई बार दिखाई देता है, तो प्रतिस्थापित स्ट्रिंग एक मान्य संख्या नहीं होगी

2
Panagiotis Kanavos 20 पद 2017, 12:26

यह आपको वांछित आउटपुट देगा:

string[] things = new string[] { "1", "10", "2", "1_1", "2_1", "3_1" };
var list =  from row in things select Decimal.Parse(row.Replace("_",CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator));
list = list.OrderBy(d=> d).ToList();
var StringList = from row in list select row.ToString("0.#").Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "_");
2
Code Pope 20 पद 2017, 12:53