我有一个关于在Datatable中排序的问题。我有一个像下面这样的表,想要从小到大排序。问题是当我有相同的数字时,我想让第一个作为最后一个等等......
表:-----------------------------------排序后:
Name Bit Size Name Bit Size (corrected)
A 0 1 A 0 1
C 1 2 C 1 2
B 1 3 B 1 3
D 1 1 D 1 1
我想要的结果:
Name Bit Size (corrected)
A 0 1
D 1 1
B 1 3
C 1 2
我的代码:
arraySBit.DefaultView.Sort = "Bit";
arraySBit = arraySBit.DefaultView.ToTable();
答案 0 :(得分:1)
您可以使用Linq-To-DataTable
:
var tblSorted = table.AsEnumerable()
.OrderBy(r => r.Field<int>("Bit"))
.CopyToDataTable();
修改:但实际上DataView.Sort
也应该有效(已测试)。
由于您已编辑了问题。您的要求似乎已经满足。如果Bit
是相同的,您不希望按某种顺序排序,但您希望reverse
相等行的“顺序”(因此Ordinal
位置DataTable
)。
这就是你想要的,虽然我不确定它真的是你需要的东西:
DataTable tblSorted = table.AsEnumerable()
.Select((Row, Ordinal) => new {Row,Ordinal})
.OrderBy(x => x.Row.Field<int>("Bit"))
.ThenByDescending(x => x.Ordinal)
.Select(x => x.Row)
.CopyToDataTable();
基本上,它通过此重载Enumerable.Select
将表中行的索引传递给匿名类型。然后它将首先按Bit
排序,然后按索引/序数排序。
答案 1 :(得分:0)
解决方法,
在这些行之后,您应该根据需要生成arrySBit
DataTable arrySBitClone = arrySBit.Copy();
arrySBit.DefaultViewSort.Sort = "Bit";
bool different = false;
for(int i=0; i<arrySBit.Rows.Count; i++)
{
if(arrySBit.Rows[i]["Bit"]!=arrySBitClone.Rows[i]["Bit"])
{
difference = true;
break;
}
}
if(!different)
{
arrySBit = arrySBit.Copy();
}
答案 2 :(得分:0)
如果我的问题得到了解决。 为什么不使用Select?
DataTable dt = arraySBit.Select(“”,“Bit,Size”)。CopyToDataTable();
Select Method的第一个参数是要过滤的条件,第二个是Order By,所以它应该可以工作