簡體   English   中英

自定義列表按多個條件排序

[英]Custom List Sort by multiple conditions

我有一個帶有字符串字段的類,我想通過使用多個條件對其進行排序。

有關課程

class Items
{
    public string ItemType {get; set;}
    public string Code {get; set;}

    // other members elided

    public Items(string _IT, string _Cd)
    {
        ItemType = _IT;
        Code = _Cd;
    }
}

使用課程

List<Items> lstItemCol = new List<Items>();

lstItemCol.Add(new Items("EE", "12345"));
lstItemCol.Add(new Items("WW", "5881"));
lstItemCol.Add(new Items("LLL", "215458"));
lstItemCol.Add(new Items("WW", "789"));
lstItemCol.Add(new Items("EE", "582"));

我想做的是對列表進行排序,以便按EE,WW和LLL排序項目

輸出順序應為:

"EE", "582"
"EE", "12345"
"WW", "5881"
"WW", "789"
"LLL", "215458"

除了將另一個字段添加到類( sortOrder )並對此進行排序外,我想不出一種優雅的方法:我希望避免這種情況,而僅對ItemType進行排序?

有兩種方法可以以可重用和干凈的方式實現。

  1. 在項目上實現IComparable

  2. 創建您自己的項目比較器,並將其用作對linq進行排序的參數。

PS:我還建議對類名Item使用單數形式,而不是復數形式的Item。 項目通常是指集合。

PPS:我還使用linqpad演示了實現。

void Main()
{
    var lstItemCol = new List<Item>();

    lstItemCol.Add(new Item("EE", "12345"));
    lstItemCol.Add(new Item("WW", "5881"));
    lstItemCol.Add(new Item("LLL", "215458"));
    lstItemCol.Add(new Item("WW", "789"));
    lstItemCol.Add(new Item("EE", "582"));

    lstItemCol.OrderBy(ic => ic).Dump();
    lstItemCol.OrderBy(ic => ic, new ItemComparer()).Dump();
}

// Define other methods and classes here

class Item : IComparable<Item>, IComparable
{
    public string ItemType { get; set; }
    public string Code { get; set; }

    // other members elided

    public Item(string _IT, string _Cd)
    {
        ItemType = _IT;
        Code = _Cd;
    }

    public int CompareTo(Item other)
    {
        if (other == null) return 1;
        var result = ItemType.Length.CompareTo(other.ItemType.Length);
        if (result == 0) result = ItemType.CompareTo(other.ItemType);
        if (result == 0) result = Code.Length.CompareTo(other.Code.Length);
        if (result == 0) result = Code.CompareTo(other.Code);
        return result;
    }
    int IComparable.CompareTo(object other)
    {
        return CompareTo(other as Item);
    }
}

sealed class ItemComparer : FComparer<Item>
{
    private static readonly Func<Item, Item, int> _comparer = (v1, v2) =>
    {
        var result = v1.ItemType.Length.CompareTo(v2.ItemType.Length);
        if (result == 0) result = v1.ItemType.CompareTo(v2.ItemType);
        if (result == 0) result = v1.Code.Length.CompareTo(v2.Code.Length);
        if (result == 0) result = v1.Code.CompareTo(v2.Code);
        return result;
    };

    public ItemComparer()
        :base(_comparer)
    { }
}

abstract class FComparer<T> : IComparer<T>
{
    private readonly Func<T, T, int> _comparer;

    protected FComparer(Func<T, T, int> comparer)
    { _comparer = comparer; }

    public int Compare(T v1, T v2)
    {
        return _comparer(v1, v2);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM