如何对末尾有空列值的C#Datatable进行排序
我有一个包含1000行的C#数据表。但主200行具有空值(多列)。过滤器将以空值的形式出现在这些列上,并作为最后一个值占用。我希望输出将在表中发生,或者在新表中发生,但不作为linq行。请帮帮我 图片说明更多单词,请参考以下内容以更好地理解:如何对末尾有空列值的C#Datatable进行排序,c#,.net,linq,datatable,dataview,C#,.net,Linq,Datatable,Dataview,我有一个包含1000行的C#数据表。但主200行具有空值(多列)。过滤器将以空值的形式出现在这些列上,并作为最后一个值占用。我希望输出将在表中发生,或者在新表中发生,但不作为linq行。请帮帮我 图片说明更多单词,请参考以下内容以更好地理解: 这里有两件事你应该考虑: “空值”:要对后跟空值列的项目进行排序,需要.OrderBy(s=>String.IsNullOrEmpty(s[“OrderNo”].ToString()) “订单编号格式”:要对需要使用的自定义订单编号进行排序。如您在问题中所
这里有两件事你应该考虑:
.OrderBy(s=>String.IsNullOrEmpty(s[“OrderNo”].ToString())
XXXXX
或XXXX-XXXX
李>
因此,您需要首先OrderBy
空值
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;
}
}
}
}
然后输出将与您预期的一样:
569-875
569-875
569-975
569865
569975
这里有两件事你应该考虑:
“空值”:要对后跟空值列的项目进行排序,需要.OrderBy(s=>String.IsNullOrEmpty(s[“OrderNo”].ToString())
“订单编号格式”:要对需要使用的自定义订单编号进行排序。如您在问题中所示,我假设订单号的格式可以是XXXXX
或XXXX-XXXX
李>
因此,您需要首先OrderBy
空值
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;
}
}
}
}
然后输出将与您预期的一样:
569-875
569-875
569-975
569865
569975
您必须首先对列中是否包含数据的行进行排序,然后使用LINQ按行列值进行排序。这将是一个简单的orders.OrderBy(x=>string.IsNullOrEmpty(x))
(或string.IsNullOrWhiteSpace
)。如果您还想按内容订购,只需添加一个,然后再添加一个。如果没有LINQ,您将不得不实现一个定制的IComparer
。这是您想要的还是您指的是不同的东西?@mynameisdd我的答案解决了您的问题吗?您必须首先对列中是否包含数据的行进行排序,然后使用LINQ按行列值进行排序。这将是一个简单的orders.OrderBy(x=>string.IsNullOrEmpty(x))
(或string.IsNullOrWhiteSpace
). 如果您还想按内容订购,只需添加一个,然后再添加一个。如果没有LINQ,您将不得不实现一个定制的IComparer
。这就是你想要的还是你指的是不同的东西?@MyNameIsDND我的回答解决了你的问题吗?