Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按拆分字符串C#和LINQ排序_C#_Linq - Fatal编程技术网

按拆分字符串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
强制您将分隔符作为数组提供。编辑答案以更正它。