C#Datagridview排序数字字符串除以斜杠

时间:2017-03-02 11:23:45

标签: c# sorting datagridview

有没有办法对数字字符串进行排序,如下所示:

所以它将如下:

50/51
44/148
42/51
6/12
6/12
5/8
5/13
5/13
5/12
4/4
4/26

(按/之前的数字排序)

现在正按照第一个数字排序。

我没有DataSource,我添加Columns.Add列。 或者也许有办法将其转换为int

感谢您的时间!

3 个答案:

答案 0 :(得分:1)

您可以将部分字符串解析为int并使用OrderByDescending()进行排序:

var sorted = unsorted.OrderByDescending(i => Convert.Int32(i.Split('/')[0])).ToArray();

答案 1 :(得分:1)

您有几个选项可以完成任务:

  1. 您需要通过实现IComparer接口来实现自己的排序功能。

    你的比较器应该在斜杠之前使用字符串函数indexOf,SubString或真实表达式提取数字。

    MSDN在这里给出了一个很好的例子: https://msdn.microsoft.com/en-us/library/234b841s%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

  2. 您可以执行与上述相同的操作来提取数字并运行Linq查询。如果您的列结果已加载到列表中,则可以执行以下操作:

    myList = customerList.OrderBy(x => int.Parse(x.Code)).ToList();

答案 2 :(得分:0)

几乎没有“更容易”的选择。一种是在添加它们时添加空间:

for (int i = 0; i < dataGridView1.RowCount; i++)
{
    var cell = dataGridView1[0, i];
    var strValue = cell.Value?.ToString();
    cell.Value = strValue?.PadLeft(strValue.Length + strValue.IndexOf("/"));
}

或者,如果第二个数字也应按数字排序,请在左侧填充不可打印的字符:

for (int i = 0; i < dataGridView1.RowCount; i++)
{
    var cell = dataGridView1[0, i];
    if (cell.Value != null)
        cell.Value = string.Join("/", cell.Value.ToString().Split('.').Select(s => s.PadLeft(5, '\t')));
}

dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);

另一个选项可以是将值转换为数字(50.51)并更改小数点分隔符:

var ci = new System.Globalization.CultureInfo("en-US", false);
ci.NumberFormat.NumberDecimalSeparator = "/";
dataGridView1.Columns[0].DefaultCellStyle.FormatProvider = ci;