আমি কীভাবে 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);
মনে রাখবেন, লিনকুই-র মতো যথারীতি এটি একটি নতুন আইনিউমেবল <T> তৈরি করে, যা যখন গণনা করা হয়, তখন মূল আইনামেবল <T> এর উপাদানগুলি সাজানো ক্রমে ফিরে আসে। এটি স্থলভাগের <<> স্থানে বাছাই করে না।
একটি IEnumerable <T> কেবল পঠনযোগ্য, এটি হ'ল আপনি কেবল এটি থেকে উপাদানগুলি পুনরুদ্ধার করতে পারেন, তবে এটি সরাসরি সংশোধন করতে পারবেন না। যদি আপনি জায়গায় স্ট্রিংয়ের একটি সংগ্রহকে বাছাই করতে চান তবে আপনাকে মূল সংগ্রহটি বাছাই করতে হবে যা আইয়ুনামেবল <স্ট্রিং> প্রয়োগ করে, বা একটি প্রাথমিক স্তরের <স্ট্রিং> কে প্রথমে বাছাইযোগ্য সংগ্রহের মধ্যে পরিণত করতে হবে:
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);