按拆分字符串C#和LINQ排序
我有这样一个数据库表:按拆分字符串C#和LINQ排序,c#,linq,C#,Linq,我有这样一个数据库表: ## Settings ## ID (string) Value (string) AreaOne.CategoryOne.MySetting AreaOne.CategoryOne.MySecondSetting AreaTwo.CategoryOne.MySetting ... ID是类似以下Area.Category.SettingName的字符串。 我正试图建立一个基于ID的菜单结构,所以我希望它是这样呈现的 - Area -- Category --- Se
## Settings ##
ID (string)
Value (string)
AreaOne.CategoryOne.MySetting
AreaOne.CategoryOne.MySecondSetting
AreaTwo.CategoryOne.MySetting
...
ID是类似以下Area.Category.SettingName的字符串。
我正试图建立一个基于ID的菜单结构,所以我希望它是这样呈现的
- Area
-- Category
--- SettingName
数据可以是这样的:
## Settings ##
ID (string)
Value (string)
AreaOne.CategoryOne.MySetting
AreaOne.CategoryOne.MySecondSetting
AreaTwo.CategoryOne.MySetting
...
为此,我尝试获取所有一级设置,并尝试使用以下代码:
List<Settings> settings = settings.GroupBy(x => x.ID.Split('.')[0]).FirstOrDefault().ToList()
但是得到了这个结果:
AreaOne
AreaTwo
AreaOne
AreaOne
AreaTwo
我做错了什么?如果您只需要一级设置,正确的查询应该是
var delimiter = new[] {'.'};
settings.Select(x => x.ID.Split(delimiter, 2)[0]).Distinct().ToList()
这将切断每行的L1设置,并使用Distinct
确保每行只返回一次。无需使用GroupBy
,除非您希望获取有关每个L1设置的聚合信息(例如,如果您希望从数据库中获取完整信息,但由于某种原因,需要根据L1设置名称进行分组)
我还使用了Split
的重载,它接受一个“limit”参数,因为做那些你将要扔掉的工作毫无意义
最后,结合使用FirstIndexOf
和Substring
将获得更好的性能。添加一个“.Distinct()”,或重新编码
var result = settings.Select(s => x.ID.Split('.')[0]).Distinct();
您需要从结果列表中删除重复条目。有三个输入,因此您将获得三个输出: 类似于以下内容的内容应仅返回其中一个:
settings.Select(x => x.ID.Split('.')[0]).Distinct().ToList()
谢谢Jon,它的工作方式应该是这样的,不需要返回完整的类,只需要返回字符串,因此它是完美的。我尝试添加一个“限制”,但出现了一个错误:''Cannot convert from'int'to'char''@Martin:因为没有足够的关注而感到内疚。如果需要限制,
Split
强制您将分隔符作为数组提供。编辑答案以更正它。