如何使用最后一个空列值过滤C#数据表

问题描述 投票:1回答:1

我有一个C#数据表,其中包含1000行。但是主要的200行具有空值(多列)。那些列将作为空值进行过滤,以最后占据。我希望输出将在带有过滤器的表或新表中发生,但不会出现在linq行中。请帮帮我

图片讲的更多话,请参考以更好地理解:

“

c# .net linq datatable dataview
1个回答
0
投票

这里您应该考虑两件事:

  1. Empty Value”:要对后面跟有空值列的项目进行排序,您需要.OrderBy(s => String.IsNullOrEmpty(s["OrderNo"].ToString()))
  2. 订单号格式”:要对自定义订单号进行排序,您需要使用IComparer<string>。正如您在问题中所显示的,我假设IComparer<string>的格式可以是Order NoXXXXX

因此,您需要首先XXXX-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"]);
}
© www.soinside.com 2019 - 2024. All rights reserved.