排序列表<;T>;使用C#具有integer属性

本文关键字:具有 integer 属性 使用 列表 lt 排序 gt | 更新日期: 2023-09-27 17:58:35

我想对我的List进行排序,其中T是Products。列表可能包含具有重复ReportSeqId的元素。我想根据ReportSeqId对其进行排序。

但标准是,如果ReportSeqId=0,那么它应该排在最后。

输入:

new ilistProd<Products>()
{
    new Products(0, Report1, SSR),
    new Products(2, Report2, SBO),
    new Products(0, Report3, PST),
    new Products(3, Report4, ABR),
    new Products(1, Report5, OSS),
    new Products(0, Report6, TCP),
}

输出:

new ilistProd<Products>()
{
    new Products(1, Report5, OSS),
    new Products(2, Report2, SBO),
    new Products(3, Report4, ABR),
    new Products(0, Report3, PST),
    new Products(0, Report6, TCP),
    new Products(0, Report1, SSR)
}

以下是我的代码:

public class Products
{
    //ctor
    public SDVar(int xiReportSeqId, string xiReportName, string xiProduct)
    {
      this.ReportSeqId = xiReportSeqId;
      this.ReportName = xiReportName;
      this.Product = xiProduct;
    }
   public int ReportSeqId {get; set;}
   public string ReportName {get; set;}
   public string Product {get; set;}
}

public class SDVar
{
    //ctor
public SDVar()
{
}
public void DoSort(ref List<Products> ilistProd)
{
    ilistProd.Sort(delegate(Products x, Products y)
    {
        if (x.ReportSeqId == 0)
        {
            if (y.ReportSeqId == 0) 
            { 
                return 0; 
            }
            return -1;
        }
        return x.ReportSeqId.CompareTo(y.ReportSeqId);
    }       
}
 }

排序列表<;T>;使用C#具有integer属性

试试这个

list.Sort(delegate(Products x, Products y)
{
    if(x.ReportSeqId == 0)
        return 1;       
    if(y.ReportSeqId == 0)
        return -1;
    return x.ReportSeqId.CompareTo(y.ReportSeqId);
}); 

通常,我的首选解决方案是添加一个额外的属性(例如SortIndex),该属性可以在Linq或排序委托中使用(其中id 0将返回int.max值),但为了使现有代码正常工作,如果第一个id不是,则应额外检查第二个id是否为0:

if (x.ReportSeqId == 0)
{
    if (y.ReportSeqId == 0)
    {
        return 0;
    }
    return 1;
}
else if (y.ReportSeqId == 0) 
    return -1;
return x.ReportSeqId.CompareTo(y.ReportSeqId);

另一种方法是实现IComparable

public class Product : IComparable<Product>
{
    private int ReportSeqId = 0;
    public int CompareTo(Product other)
    {
        if (ReportSeqId == 0 || other == null) return 1;
        if (other.ReportSeqId == 0) return - 1;
        return ReportSeqId - other.ReportSeqId;
    }
}

使用LINQ:

products = products.OrderBy(p => p.ReportSeqId == 0 ? Int32.MaxValue : p.ReportSeqId).ToList();