.net 使用字符串对多列DataTable进行排序,

2jcobegt  于 2023-10-21  发布在  .NET
关注(0)|答案(2)|浏览(117)

我想使用string.Compare对前两列的DataTable进行排序,因为我需要按匈牙利语("hu-HU_technl")进行排序。(C#,.NET 2.0)
如果前两个不可能,第一列就足够了。
我尝试了THIS..

System.Globalization.CultureInfo ci = CultureInfo.GetCultureInfo("hu-HU_technl");

StringComparer comp = System.StringComparer.Create(ci, false);
        
List<string> fields = new List<string>();
DataTable dt = GetData();
        
for (int row = 0; row < dt.Rows.Count; row++)
{
    fields.Add(dt.Rows[row][0].ToString());
}

fields.Sort(
   delegate(string p1, string p2)
   {
       return string.Compare(p1, p2, false, ci); 
   }
);
        
for (int i = 0; i < fields.Count; i++)
{
    Console.WriteLine(fields[i].ToString());
}

https://dotnetfiddle.net/39z2QX
使用string.Compare对前两列的多列DataTable进行排序。
编辑:代码我试过

//----------------------------------------------Main
    OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, conn.ConnectionString);
    DataSet ds = new DataSet();
    dAdapter.Fill(ds, "Holtak");
 
    DataTable tempTable = ds.Tables[0].Clone();
 
    ds = utils.Settings.DataTableSort(ds, "hu-HU_technl");
 
    ds.Tables[0].Columns.Add(new DataColumn("imageUrl", typeof(byte[])));
 
//----------------------------------------------utils.Settings.DataTableSort
public static DataSet DataTableSort(DataSet dt, string culture)
{
    CultureInfo ci = CultureInfo.GetCultureInfo(culture);
    StringComparer comp = System.StringComparer.Create(ci, false);
 
    List<DataRow> rows = new List<DataRow>();
 
    foreach (DataRow row in dt.Tables[0].Rows)
    {
        rows.Add(row);
    }
 
    rows.Sort(
        delegate(DataRow r1, DataRow r2)
        {
 
            int result = string.Compare((r1[2] == null ? "" : r1[2].ToString()), (r2[2] == null ? "" : r2[2].ToString()), false, ci);
 
            if (result == 0)
            {
                result = string.Compare((r1[3] == null ? "" : r1[3].ToString()), (r2[3] == null ? "" : r2[3].ToString()), false, ci);
            }
 
            return result;
        } 
    );
 
    DataSet dtresult = dt.Clone();
 
    foreach (DataRow dr in rows)
    {
        dtresult.Tables[0].Rows.Add(dr.ItemArray);
    }
    
    return dtresult;
}
2w2cym1i

2w2cym1i1#

如果要对行进行排序,请对行进行排序,而不是对行中某列的值进行排序。当通过两个值进行比较时,您进行第一次比较,然后,如果结果为零(即,这两个值是相等的),你做第二个比较。

List<DataRow> rows = new List<DataRow>();
DataTable dt = GetData();

foreach (DataRow row in dt.Rows)
{
    rows.Add(row);
}

rows.Sort(
        delegate(DataRow r1, DataRow r2)
        {
             int result = string.Compare((string)r1[0], (string)r2[0], false, ci);

             if (result == 0)
             {
                 result = string.Compare((string)r1[1], (string)r2[1], false, ci);
             }

             return result;
        }
);
svgewumm

svgewumm2#

ADO.NET从第一个.NET版本开始就允许通过DataView进行排序和过滤。语法类似于SQL。您可以按姓氏降序排序,如下所示:

var view = new DataView(dt);
view.Sort="LastName Desc,Name Asc";

foreach (DataRowView dataRow in view)
{
    Console.WriteLine("{0,4} {1,-10} {2}",dataRow["ID"], dataRow["Name"], dataRow["LastName"]);
}

顺便说一下,.NET Framework 2不仅仅是旧的,它是discontinued since 2011。很有可能你的应用程序至少运行在3.5上,因为即使是Windows Vista也有.NET 3.0。目前支持的.NET Framework最旧版本是4.6.2

相关问题