मैं IEnumerable<string>
वर्णानुक्रम में कैसे छांट सकता हूं । क्या यह संभव है?
संपादित करें: मैं एक जगह समाधान कैसे लिखूंगा?
जवाबों:
उसी तरह से आप किसी अन्य गणना योग्य को छांट लेंगे:
var result = myEnumerable.OrderBy(s => s);
या
var result = from s in myEnumerable
orderby s
select s;
या (मामले की अनदेखी)
var result = myEnumerable.OrderBy(s => s,
StringComparer.CurrentCultureIgnoreCase);
ध्यान दें कि, जैसा कि LINQ के साथ सामान्य है, यह एक नया IEnumerable <T> बनाता है, जो गणना करते समय, क्रमबद्ध क्रम में मूल IEnumerable <T> के तत्वों को वापस करता है। यह IEnumerable <T> इन-प्लेस को सॉर्ट नहीं करता है।
एक IEnumerable <T> केवल पढ़ने के लिए है, अर्थात्, आप केवल इसमें से तत्वों को पुनः प्राप्त कर सकते हैं, लेकिन इसे सीधे संशोधित नहीं कर सकते। यदि आप स्ट्रिंग्स के संग्रह को इन-प्लेस में सॉर्ट करना चाहते हैं, तो आपको मूल संग्रह को सॉर्ट करना होगा जो IEnumerable <string> को लागू करता है, या पहले एक सॉर्टेबल संग्रह में IEnumerable <string> को चालू करता है:
List<string> myList = myEnumerable.ToList();
myList.Sort();
आपकी टिप्पणी के आधार पर:
_components = (from c in xml.Descendants("component")
let value = (string)c
orderby value
select value
)
.Distinct()
.ToList();
या
_components = xml.Descendants("component")
.Select(c => (string)c)
.Distinct()
.OrderBy(v => v)
.ToList();
या (यदि आप बाद में सूची में और आइटम जोड़ना चाहते हैं और इसे क्रमबद्ध रखना चाहते हैं)
_components = xml.Descendants("component")
.Select(c => (string)c)
.Distinct()
.ToList();
_components.Add("foo");
_components.Sort();
OrderBy
लौटता है IOrderedEnumerable<T>
। IOrderedEnumerable<T>
व्युत्पन्न IEnumerable<T>
तो इसे इस्तेमाल किया जा सकता है IEnumerable<T>
, लेकिन यह प्रकार का विस्तार करता है, उदाहरण के लिए, के उपयोग के लिए अनुमति देता है ThenBy
।
यह असंभव है, लेकिन ऐसा नहीं है।
मूल रूप से, किसी भी प्रकार के विधि अपने प्रतिलिपि करने के लिए जा रहा है IEnumerable
एक में List
तरह, List
और फिर आप के लिए क्रमबद्ध सूची है, जो एक वापसी IEnumerable
एक के रूप में भी IList
।
इसका मतलब है कि आप "अनन्त रूप से जारी रखें" की संपत्ति खो देते हैं IEnumerable
, लेकिन फिर आप उस तरह से एक भी नहीं छाँट सकते।
हम हमेशा इसे अंदर नहीं कर सकते, लेकिन हम इसका पता लगाते हैं कि यह कब संभव है:
IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, IComparer<T> cmp)
{
List<T> listToSort = (src is List<T>) ? (List<T>)src : new List<T>(src);
listToSort.Sort(cmp);
return listToSort;
}
IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, Comparison<T> cmp)
{
return SortInPlaceIfCan(src, new FuncComparer<T>(cmp));
}
IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src)
{
return SortInPlaceIfCan(src, Comparer<T>.Default);
}
यह निम्नलिखित आसान संरचना का उपयोग करता है:
internal struct FuncComparer<T> : IComparer<T>
{
private readonly Comparison<T> _cmp;
public FuncComparer(Comparison<T> cmp)
{
_cmp = cmp;
}
public int Compare(T x, T y)
{
return _cmp(x, y);
}
}
listToSort = (src is List<T>) ? (List<T>)src : new List<T>(src);
क्यों? इसके बारे में क्या पसंद हैlistToSort = (src as List<T>); if (null == listToSort) listToSort = new List<T>(src);