如何使用Linq合并字符串与列表?解决Union方法报错问题
嘿,我来帮你搞定这个Linq的小问题!
你遇到的CS1928错误,核心原因是单个字符串调用.ToList()的行为和你想的不一样:当你对string类型的ref_clus调用.ToList()时,它会把这个字符串拆成一个个char字符的集合(因为string本质是char的数组),而不是把这个字符串包装成一个只有单个元素的List<string>。这就导致后面的Union方法接收到的是IEnumerable<char>类型的参数,和前面Union返回的IEnumerable<string>类型不匹配,编译器找不到合适的重载方法,所以报错了。
要实现一行代码合并所有内容且去重,你只需要把单个字符串包装成IEnumerable<string>类型的序列就行,有两种简单的方式:
方式一:用数组初始化器包装单个字符串
这是最简洁的写法:
string[] clus_list = prim_clus_list.Union(ref_clus_list).Union(new[] { ref_clus }).Union(new[] { prim_clus }).ToArray();
new[] { ref_clus }会创建一个只包含ref_clus这个字符串的string[],也就是IEnumerable<string>类型,和前面的序列类型完全匹配,就能正常调用Union了。
方式二:用Enumerable.Repeat生成单元素序列
如果你觉得数组初始化器不够直观,也可以用Linq的Repeat方法:
string[] clus_list = prim_clus_list.Union(ref_clus_list).Union(Enumerable.Repeat(ref_clus, 1)).Union(Enumerable.Repeat(prim_clus, 1)).ToArray();
Enumerable.Repeat(ref_clus, 1)会生成一个只包含一次ref_clus的IEnumerable<string>序列,同样能和前面的Union无缝衔接。
两种方式都能实现你的需求:合并prim_clus_list、ref_clus_list、ref_clus、prim_clus所有内容,并且通过Union自动去重,最终转成string[]数组。
内容的提问来源于stack exchange,提问作者Mark McGown

