排序DataTable的扩展方法

时间:2018-04-07 09:53:37

标签: c#

我正在尝试使用extensionmethod对DataTable进行排序。如果在代码体中使用,这可以正常工作:

DataView dv = dtSensors.DefaultView;
dv.Sort = "DeviceName";
dtSensors = dv.ToTable();

然而,像这样使用它不会:

public static void SortTable(this DataTable dt, string sortColumn)
{
     DataView dv = dt.DefaultView;
     dv.Sort = sortColumn;
     dt = dv.ToTable();
}

为什么扩展方法在这种情况下不起作用?

谢谢,

彼得

1 个答案:

答案 0 :(得分:2)

您在方法中为dt分配了一个新值,但不会更改调用方法时使用的变量 - 它是一个值参数。

作为一个简单的例子:

using System;

static class Int32Extensions
{
    // This doesn't do what you might expect it to!
    public static void Increment(this int x)
    {
        x = x + 1;
    }
}

class Test
{
    static void Main()
    {
        int x = 10;
        x.Increment();
        Console.WriteLine(x); // Still 10
    }
}

我个人会将方法写入返回新表,并适当修改名称:

public static DataTable SortedBy(this DataTable dt, string sortColumn)
{
     DataView dv = dt.DefaultView;
     dv.Sort = sortColumn;
     return dv.ToTable();
}

然后将其用作:

table = table.SortedBy("columnName");

稍微关注对DefaultView的修改是否会在原始表格中保留 - 这样的方法改变是不理想的原始物体。这取决于DefaultView每次调用时都会创建一个新视图......