簡體   English   中英

如何對 C# 數據表進行排序,最后帶有空列值

[英]How to sort C# Datatable with empty column values at the end

我有一個包含 1000 行的 C# 數據表。 但主要的 200 行有空值(多列)。 過濾器會發生在這些列上,作為最后占用的空值。 我希望 output 將發生在帶有過濾器的表或新表中,但不是 linq 行。 請幫幫我

圖片說話更多,參考這個以獲得更好的理解:

圖片

這里有兩件事你應該考慮:

  1. 空值” :要對后跟空值列的項目進行排序,您需要.OrderBy(s => String.IsNullOrEmpty(s["OrderNo"].ToString()))
  2. 訂單無格式”:要對自定義訂單號進行排序,您需要使用IComparer<string> 正如您在問題中顯示的那樣,我假設Order No的格式可以是XXXXXXXXX-XXXX

所以你需要先OrderBy空值ThenBy你的自定義IComparer<string>是這樣的:

public class OrderNoComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        int xFirstValue = 0;
        int xSecondValue = 0;

        int yFirstValue = 0;
        int ySecondValue = 0;

        if (x.Contains("-"))
        {
            xFirstValue = Convert.ToInt32(x.Split(new char[] { '-' })[0]);
            xSecondValue = Convert.ToInt32(x.Split(new char[] { '-' })[1]);
        }
        else
        {
            xFirstValue = Convert.ToInt32(x);
        }

        if (y.Contains("-"))
        {
            yFirstValue = Convert.ToInt32(y.Split(new char[] { '-' })[0]);
            ySecondValue = Convert.ToInt32(y.Split(new char[] { '-' })[1]);
        }
        else
        {
            yFirstValue = Convert.ToInt32(y);
        }


        if (xFirstValue > yFirstValue)
        {
            return 1;
        }
        else if (xFirstValue < yFirstValue)
        {
            return -1;
        }
        else //means equal
        {
            if (xSecondValue > ySecondValue)
            {
                return 1;
            }
            else if (xSecondValue == ySecondValue)
            {
                return 0;

            }
            else
            {
                return -1;
            }
        }
    }
}

完整的例子在這里:

DataTable dtOrder = new DataTable();
dtOrder.Columns.Add("OrderNo");

var dr1 = dtOrder.NewRow();
dr1["OrderNo"] = "";
dtOrder.Rows.Add(dr1);

var dr2 = dtOrder.NewRow();
dr2["OrderNo"] = "569-875";
dtOrder.Rows.Add(dr2);

var dr3 = dtOrder.NewRow();
dr3["OrderNo"] = "569975";
dtOrder.Rows.Add(dr3);

var dr4 = dtOrder.NewRow();
dr4["OrderNo"] = "569865";
dtOrder.Rows.Add(dr4);

var dr5 = dtOrder.NewRow();
dr5["OrderNo"] = "569-975";
dtOrder.Rows.Add(dr5);

var dr6 = dtOrder.NewRow();
dr6["OrderNo"] = "569-875";
dtOrder.Rows.Add(dr6);


var result = dtOrder.AsEnumerable().AsQueryable()
                .OrderBy(s => String.IsNullOrEmpty(s["OrderNo"].ToString()))
                .ThenBy(o => o["OrderNo"].ToString(), new OrderNoComparer())
                .ToList();

foreach (var item in result)
{
    Console.WriteLine(item["OrderNo"]);
}

那么 output 會像您預期的那樣:

569-875
569-875
569-975
569865
569975

暫無
暫無

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

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