gpt4 book ai didi

.net - 如何使用 IComparable 之类的方法自然地对 DataView 进行排序

转载 作者:行者123 更新时间:2023-12-03 02:02:25 26 4
gpt4 key购买 nike

我的 DataView 表现得很有趣,它按字母顺序对事物进行排序,而我需要它按数字对事物进行排序。我在整个网络上查找了这个问题,发现了很多关于如何使用 ICompare 对其进行排序的想法,但没有什么真正可靠的。

所以我的问题是

  1. 如何在 DataView 上实现 ICompare(在此处查找代码)。
  2. 如何正确解读一列充满字符串的实际字符串和一列充满数字(带逗号)的内容。

我需要代码来帮助我解决这个问题。我或多或少迷失了 ICompare 的想法以及如何在不同场景中实现,因此总体上很好的解释会很棒。

另外,请不要给我链接。我正在寻找有关此问题的可靠答案。

我使用的一些代码。

    DataView dataView = (DataView)Session["kingdomData"];
dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
gvAllData.DataSource = dataView;
gvAllData.DataBind();



private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
string newSortDirection = String.Empty;
if (Session["SortDirection"] == null)
{
switch (sortDirection)
{
case SortDirection.Ascending:
newSortDirection = "ASC";
break;
case SortDirection.Descending:
newSortDirection = "DESC";
break;
}
}
else
{
newSortDirection = Session["SortDirection"].ToString();
switch (newSortDirection)
{
case "ASC":
newSortDirection = "DESC";
break;
case "DESC":
newSortDirection = "ASC";
break;
}
}
Session["SortDirection"] = newSortDirection;
return newSortDirection;
}
<小时/>

对于该场景,我动态构建一个数据表并将其插入数据 View ,其中我将数据 View 放入 GridView ,同时还记得将数据 View 放入 session 对象中以实现排序功能。

当用户调用 gridview 对列进行排序时,我会调用 session 对象中的 dataview 并构建如下所示的 dataview 排序表达式:

dataview.sort = e.sortexpression + " " + e.Sortdirection; 

或者类似的东西。所以通常结果对于所有真实的字符串都是正确的,例如

汽车;家;斯科特;扎克等...

但是当我对带有逗号分隔值的数字字段执行相同操作时,结果类似于

900; 800; 700; 600; 200; 120; 1,200; 12,340; 1,000,000;

明白我的意思了吗?它只是将项目排序为 alpha 排序而不是自然排序。我想让我的数据 View 自然地对数字列进行正确排序,就像

120; 200; 600; 700; 800; 900; 1,200; 12,340; 1,000,000;

请告诉我您可以做些什么来帮助我。
附:我浏览了无数关于如何做到这一点的文章,他们都说要插入列表/数组并这样做,但有没有更有效的方法?

最佳答案

对于第一期 - IIRC,您无法使用比较器对 DataView 进行排序。如果您只需要对字段进行数字排序,则必须确保列类型是数字而不是字符串。一些代码将有助于阐明这一点。

对于第二个问题,您也不能直接在 DataView 中执行此操作。如果您确实需要根据列中数据的某些处理对记录进行排序,那么我会将数据复制到数组中并在数组上使用 IComparer:

DataView dv = new DataView(dt);
ArrayList lst = new ArrayList();
lst.AddRange(dv.Table.Rows);
lst.Sort(new MyComparer());
foreach (DataRow dr in lst)
Debug.WriteLine(dr[0]);

比较器是这样的:

    class MyComparer : IComparer
{
public int Compare(object x, object y)
{
DataRow rx = x as DataRow;
DataRow ry = y as DataRow;
string datax = (string)rx[colName];
string datay = (string)ry[colName];
// Process datax and datay here then compare them (ASC)
return datax.CompareTo(datay);
}
}

这会增加内存消耗,因此您需要考虑是否有更好的方法来预处理表中的数据,以便您可以直接按列对DataView进行排序。

附注colName 是您想要作为排序依据的列的名称。将注释替换为实际代码以从列中提取排序信息。您还可以使用此方法从更多列中提取排序信息。只需使用这样的东西:

int cmp = colAx.CompareTo(colAy);
if (cmp != 0)
return cmp;
cmp = colBy.CompareTo(colBx);
return cmp;

这将按 colA 值升序比较,然后按 colB 值降序比较(不是第二个比较首先是 y,然后是 x)

编辑:好的,我错误地解释了术语“逗号分隔值”。从你的例子来看,我认为你实际上指的是带有千位分隔符的数字(1,000,000 = 一百万)。如果您在数据库中存储这样的数字,那么您一定正在使用文本字段,这应该是您的排序顺序是字母数字的原因。

基于这个假设,我建议将该列的类型更改为数字,保留普通数字,并仅在显示它们时对其进行格式化(使用千位分隔符)。这样,排序应该直接在 DataView 中进行,而不必复制数据。

关于.net - 如何使用 IComparable 之类的方法自然地对 DataView 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/89987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com