有没有办法对数字字符串进行排序,如下所示:
所以它将如下:
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
?
感谢您的时间!
答案 0 :(得分:1)
您可以将部分字符串解析为int
并使用OrderByDescending()
进行排序:
var sorted = unsorted.OrderByDescending(i => Convert.Int32(i.Split('/')[0])).ToArray();
答案 1 :(得分:1)
您有几个选项可以完成任务:
您需要通过实现IComparer接口来实现自己的排序功能。
你的比较器应该在斜杠之前使用字符串函数indexOf,SubString或真实表达式提取数字。
MSDN在这里给出了一个很好的例子: https://msdn.microsoft.com/en-us/library/234b841s%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
您可以执行与上述相同的操作来提取数字并运行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;