假設我有一個串列,所有元素都有一個 order 屬性,但 ID 為 4 的 Element 除外:
List<Element> elements = new List<Element> {
new Element {Id = 1, Name = "First", Order = 2},
new Element {Id = 2, Name = "Second", Order = 3},
new Element {Id = 3, Name = "Third", Order = 1},
new Element {Id = 4, Name = "Fourth", Order = null};
我需要根據order屬性對元素進行就地排序,但不考慮 ID 為 4 的元素,因為它的 order 屬性設定為 null。
public void ModifyList() {
Order(elements);
return elements; // I want to end up with Element Id:3,
// Element Id:1, Element Id:2 and the last
// one Element with Id:4 (it is returned
// as the last element as the sort did not apply to it.
}
private static void Order(IList<Element> elements) {
elements.Sort((x, y) => x.Order.CompareTo(y.Order));
}
我知道我可以首先創建一個包含具有 order 屬性的元素的串列,對它們進行排序,然后附加到沒有該屬性的串列中,有沒有更簡潔的方法來做到這一點。(不使用 OrderBy())。
uj5u.com熱心網友回復:
您可以撰寫自己的比較器以確保 Nulls 最終出現:
public sealed class ElementComparer: IComparer<Element>
{
public int Compare(Element? x, Element? y)
{
if (ReferenceEquals(x, y))
return 0;
if (ReferenceEquals(null, y))
return 1;
if (ReferenceEquals(null, x))
return -1;
if (x.Order == null)
return 1;
if (y.Order == null)
return -1;
return x.Order.Value.CompareTo(y.Order.Value);
}
}
然后,您可以像這樣對串列中的元素進行就地排序:
elements.Sort(new ElementComparer());
如果你嘗試一下,你會看到它是按順序排序的,.Order但最后有任何空值。
需要注意的一件事List<T>.Sort()是不穩定的排序,這意味著在排序之后,具有相同.Order(包括空值)的專案的順序是不確定的。
Enumerable.OrderBy()執行穩定排序。
uj5u.com熱心網友回復:
嘗試:
foreach(var item in elements.OrderBy( x=> (x.Order is null ? 9999 : x.Order))) {
System.Console.WriteLine(item.Id);
}
當然,您應該更改的9999值Id也在該范圍內時...
參見:小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462155.html
上一篇:計劃的動態自定義過濾表
