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

时间:2012-05-07 11:02:40

标签: c# linq

我有一个这样的数据库表:

## 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

我做错了什么?

3 个答案:

答案 0 :(得分:1)

如果你想要的只是第一级设置,那么正确的查询将是

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

这会切断每行的L1设置,并使用Distinct确保您只返回一次。除非您想获取有关每个L1设置的汇总信息,否则无需使用GroupBy(例如,如果您希望从数据库中获取完整信息,但是在L1设置名称上分组,因为出于某种原因它很方便)。

我还使用了Split的重载,它带有一个“限制”参数,因为你要扔掉的工作毫无意义。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

以下内容应该只返回其中一个:

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