按拆分字符串 C# 和 LINQ 排序
本文关键字:LINQ 排序 拆分 字符串 | 更新日期: 2023-09-27 18:33:20
我有一个这样的数据库表:
## Settings ##
ID (string)
Value (string)
ID 是一个字符串,类似于 area.Category.SettingName。我正在尝试基于 ID 构建菜单结构,所以我希望它像这样呈现。
- Area
-- Category
--- SettingName
数据可能是这样的:
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 设置名称分组)。
我还使用了采用"limit"参数的重载Split
,因为做要扔掉的工作是没有意义的。
最后,结合使用FirstIndexOf
和Substring
在性能方面会更好。
添加一个 '.Distinct()' 或重新编码以执行
var result = settings.Select(s => x.ID.Split('.')[0]).Distinct();
您需要从结果列表中消除重复条目。有三个输入,因此您将获得三个输出:
如下所示的内容应仅返回其中的一个:
settings.Select(x => x.ID.Split('.')[0]).Distinct().ToList()