ฉันจะเรียงลำดับIEnumerable<string>
ตามตัวอักษรได้อย่างไร เป็นไปได้หรือไม่
แก้ไข: ฉันจะเขียนโซลูชันแบบแทนที่ได้อย่างไร
ฉันจะเรียงลำดับ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> เป็นแบบอ่านอย่างเดียวนั่นคือคุณสามารถดึงองค์ประกอบจากมันได้ แต่ไม่สามารถแก้ไขได้โดยตรง หากคุณต้องการจัดเรียงคอลเลกชันของสตริงในตำแหน่งคุณต้องเรียงลำดับคอลเลคชันดั้งเดิมที่ใช้ <string> ของ IEnumerable หรือเปลี่ยน 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
ซึ่งหมายความว่าคุณสูญเสียคุณสมบัติ "ดำเนินต่อไปไม่สิ้นสุด" ของ an IEnumerable
แต่คุณก็ไม่สามารถเรียงลำดับได้เช่นนั้น
myEnumerable = myEnumerable.OrderBy(s => s);
เราไม่สามารถทำได้ในสถานที่เสมอไป แต่เราตรวจพบเมื่อเป็นไปได้:
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);