Datgridview的自然排序

时间:2016-12-20 09:56:12

标签: c# sorting datagridview

我有一个带有列的数据网格,允许用户输入可能包含数字的字符串。我已经按照编程方式对其进行了自动排序。 我已查看有关此网站和其他网站的所有可用信息,但未发现任何有效或在某些情况下我能够知道如何实施。 许多解决方案使用Icomparer,但很少有专门用于datagridview。 这是执行datagridview1.Sort(Column1,ListSortDirection.Ascending)后的列数据的示例;

1
140
2b
40
70
7a
9
aa
aa30
aa5
bc
de

我使用此站点的解决方案介绍了MyDatagridHelper类和相关代码: C#: Custom sort of DataGridView, 但是,它给出了以下结果

aa
bc
de
aa30
2b
7a
70
1
40
140
9
aa5

所有其他解决方案并非特定于datagridview。我是自学而且相对较新的编码,所以我无法理解其中的代码。我尽力找到共性并剪切和粘贴,但无济于事。 我认为的一些例子显示了承诺并且可能做的工作是: https://www.codeproject.com/articles/22517/natural-sort-comparerNatural Sort Order in C#

我实际上需要有关如何实施这些或任何其他可能完成工作的解决方案的帮助。 为简单起见,我没有列入第二列,因为它与问题无关。 感谢

1 个答案:

答案 0 :(得分:0)

您链接到的代码项目文章22517具有您需要的逻辑,只需要通过创建DataGridView而不是{{1}的实现来对System.Collections.IComparer进行一些调整}}

因此,如果您在项目中创建一个类似这样的新类:

System.Collections.Generic.Comparer

你可以在这里看到我已经硬编码使用名为" Column1"根据你的例子,但你可以改变它以使其更具活力。

当您对网格进行排序时,您可以传入刚刚创建的此类的新实例,如下所示:

public class NaturalSortComparer : System.Collections.IComparer {

    private System.Collections.Generic.Dictionary<string, string[]> table;

    public NaturalSortComparer() {
        table = new System.Collections.Generic.Dictionary<string, string[]>();
    }

    public void Dispose() {
        table.Clear();
        table = null;
    }

    public int Compare(object x, object y) {
        System.Windows.Forms.DataGridViewRow DataGridViewRow1 = (System.Windows.Forms.DataGridViewRow)x;
        System.Windows.Forms.DataGridViewRow DataGridViewRow2 = (System.Windows.Forms.DataGridViewRow)y;

        string xStr = DataGridViewRow1.Cells["Column1"].Value.ToString();
        string yStr = DataGridViewRow2.Cells["Column1"].Value.ToString();


        if (xStr == yStr) {
            return 0;
        }
        string[] x1, y1;
        if (!table.TryGetValue(xStr, out x1)) {
            x1 = System.Text.RegularExpressions.Regex.Split(xStr.Replace(" ", ""), "([0-9]+)");
            table.Add(xStr, x1);
        }
        if (!table.TryGetValue(yStr, out y1)) {
            y1 = System.Text.RegularExpressions.Regex.Split(yStr.Replace(" ", ""), "([0-9]+)");
            table.Add(yStr, y1);
        }

        for (int i = 0; i < x1.Length && i < y1.Length; i++) {
            if (x1[i] != y1[i]) {
                return PartCompare(x1[i], y1[i]);
            }
        }
        if (y1.Length > x1.Length) {
            return 1;
        } else if (x1.Length > y1.Length) {
            return -1;
        } else {
            return 0;
        }
    }

    private static int PartCompare(string left, string right) {
        int x, y;
        if (!int.TryParse(left, out x)) {
            return left.CompareTo(right);
        }

        if (!int.TryParse(right, out y)) {
            return left.CompareTo(right);
        }

        return x.CompareTo(y);
    }
}