按拆分字符串 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

我做错了什么?

按拆分字符串 C# 和 LINQ 排序

如果您只需要一级设置,则正确的查询将是

var delimiter = new[] {'.'};
settings.Select(x => x.ID.Split(delimiter, 2)[0]).Distinct().ToList()

这将从每行中切断 L1 设置,并使用Distinct来确保每个设置只返回一次。无需使用 GroupBy,除非您想要获取有关每个 L1 设置的聚合信息(例如,如果要从数据库中获取完整信息,但由于某种原因很方便而按 L1 设置名称分组)。

我还使用了采用"limit"参数的重载Split,因为做要扔掉的工作是没有意义的。

最后,结合使用FirstIndexOfSubstring在性能方面会更好。

添加一个 '.Distinct()' 或重新编码以执行

var result = settings.Select(s => x.ID.Split('.')[0]).Distinct();

您需要从结果列表中消除重复条目。有三个输入,因此您将获得三个输出:

如下所示的内容应仅返回其中的一个:

settings.Select(x => x.ID.Split('.')[0]).Distinct().ToList()