我怎样才能以数字方式和最短的顺序对多位数字字符串整数进行排序? C#
how can i order multiple digit string integers numerically and by shortest first? C#
我在数据库中保存了一个实体,该实体具有 2 个相关属性,代码和数字。
数字只是 1 到 99 之间的整数,而代码是字符串表示形式,如“01”到“99”
问题是一些子实体有像“0103”或“3301”这样的代码,这只是父实体的代码 + 它自己的代码。
所有的实体都保存在一个table上,有3层仅由代码长度表示,“00”是一级,“0000”是二级,“000000”是 3 级。
我想按照它们呈现的方式来订购它们
- 姓名 - 01
- 名称 - 010201
- 姓名 - 0103
- 姓名 - 02
- 姓名 - 0201
- 姓名 - 04
等等...
第一个是“01”的实体,然后是“01”开头的实体,每个实体下面都是以“01xx”开头的实体,类似于树状层次结构。
请注意,我使用的是 EFcore 5、.NET 5 和 C# 9
我现在拥有的只是
var SearchQuery = _appDbContext.Regions.AsNoTracking().AsQueryable().OrderBy(r => r.Code);
然后我使用该查询生成我的 DTO
ResultData = await SearchQuery.Select(r => new DTO
{
Id = r.Id,
NameCode = r.Name + " - " + r.Code
}).ToListAsync();
我应该使用自定义比较器还是其他东西?或者这种方法是否满足?
使用 IComparable :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication20
{
class Program
{
static void Main(string[] args)
{
string[] array = {"name - 01", "name - 010201", "name - 0103", "name - 02", "name - 0201", "name - 04"};
string[] sorted = array.Select(x => new Sort(x)).OrderBy(x => x).Select(x => x.numericStr).ToArray();
}
}
public class Sort : IComparable<Sort>
{
public string numericStr { get; set; }
string[] split { get; set; }
string number { get; set; }
public Sort(string input)
{
numericStr = input;
split = input.Split(new char[] { ' ' }).ToArray();
}
public int CompareTo(Sort other)
{
int minSize = Math.Min(split.Length, split.Length);
for(int i = 0; i < minSize; i++)
{
int c = split[i].CompareTo(other.split[i]);
if (c != 0) return c;
}
return split.Length.CompareTo(other.split.Length);
}
}
}
我设法制作了一个函数,该函数在 3 个不同的列表中收集级别 1、2、3 的实体(在应用过滤器之后)然后循环遍历它不到几次并将它们插入到 List<Entity>
顺序正确
但是@CharlesMager 已经向我说明正常的 OrderBy(r => r.Code)
将具有完全相同的结果,因为代码 属性 没有任何空格。
换句话说:
OrderBy(r => r.Code)
不会像我之前认为的那样对 01
、02
、01xx
中的字符串进行排序;
相反,它会按照正确的顺序对它们进行排序,例如 01
、01xx
、02
、02xx
等等。
我在数据库中保存了一个实体,该实体具有 2 个相关属性,代码和数字。
数字只是 1 到 99 之间的整数,而代码是字符串表示形式,如“01”到“99”
问题是一些子实体有像“0103”或“3301”这样的代码,这只是父实体的代码 + 它自己的代码。
所有的实体都保存在一个table上,有3层仅由代码长度表示,“00”是一级,“0000”是二级,“000000”是 3 级。
我想按照它们呈现的方式来订购它们
- 姓名 - 01
- 名称 - 010201
- 姓名 - 0103
- 姓名 - 02
- 姓名 - 0201
- 姓名 - 04
等等...
第一个是“01”的实体,然后是“01”开头的实体,每个实体下面都是以“01xx”开头的实体,类似于树状层次结构。
请注意,我使用的是 EFcore 5、.NET 5 和 C# 9
我现在拥有的只是
var SearchQuery = _appDbContext.Regions.AsNoTracking().AsQueryable().OrderBy(r => r.Code);
然后我使用该查询生成我的 DTO
ResultData = await SearchQuery.Select(r => new DTO
{
Id = r.Id,
NameCode = r.Name + " - " + r.Code
}).ToListAsync();
我应该使用自定义比较器还是其他东西?或者这种方法是否满足?
使用 IComparable :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication20
{
class Program
{
static void Main(string[] args)
{
string[] array = {"name - 01", "name - 010201", "name - 0103", "name - 02", "name - 0201", "name - 04"};
string[] sorted = array.Select(x => new Sort(x)).OrderBy(x => x).Select(x => x.numericStr).ToArray();
}
}
public class Sort : IComparable<Sort>
{
public string numericStr { get; set; }
string[] split { get; set; }
string number { get; set; }
public Sort(string input)
{
numericStr = input;
split = input.Split(new char[] { ' ' }).ToArray();
}
public int CompareTo(Sort other)
{
int minSize = Math.Min(split.Length, split.Length);
for(int i = 0; i < minSize; i++)
{
int c = split[i].CompareTo(other.split[i]);
if (c != 0) return c;
}
return split.Length.CompareTo(other.split.Length);
}
}
}
我设法制作了一个函数,该函数在 3 个不同的列表中收集级别 1、2、3 的实体(在应用过滤器之后)然后循环遍历它不到几次并将它们插入到 List<Entity>
顺序正确
但是@CharlesMager 已经向我说明正常的 OrderBy(r => r.Code)
将具有完全相同的结果,因为代码 属性 没有任何空格。
换句话说:
OrderBy(r => r.Code)
不会像我之前认为的那样对 01
、02
、01xx
中的字符串进行排序;
相反,它会按照正确的顺序对它们进行排序,例如 01
、01xx
、02
、02xx
等等。