0

我有一个关于在 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();
4

3 回答 3

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第一个和索引/序数第二个排序。

于 2013-01-08T13:33:38.983 回答
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(); 
}
于 2013-01-08T13:50:40.283 回答
0

如果我说对了你的问题。为什么不使用选择?

DataTable dt = arraySBit.Select("", "Bit, Size").CopyToDataTable();

Select Method的第一个参数是过滤条件,第二个是Order By,所以它应该可以工作

于 2013-01-08T15:46:37.913 回答