如何使用LINQ从List <string>中删除重复的组合

Tho*_*eld 3 c# linq duplicate-removal

我有一个像List的字符串

List<string> MyList = new List<string>
{ 
    "A-B", 
    "B-A", 
    "C-D", 
    "C-E", 
    "D-C",
    "D-E",
    "E-C",
    "E-D",
    "F-G",
    "G-F"
};
Run Code Online (Sandbox Code Playgroud)

我需要从列表中删除重复,即,如果存在"AB"和"BA",那么我只需要保留"AB"(第一个条目)

所以结果就像

"A-B"   
"C-D"
"C-E"   
"D-E"
"F-G"
Run Code Online (Sandbox Code Playgroud)

有没有办法用LINQ做到这一点?

gan*_*tas 14

实现IEqualityComparer会在Equals("AB","BA")上返回true.并使用Enumerable.Distinct方法

  • @abatischev:我不知道 - 给IEqualityComparer imlpementation感觉就像在做别人的作业... (4认同)

Fre*_*örk 12

这将返回您查找的序列:

var result = MyList
    .Select(s => s.Split('-').OrderBy(s1 => s1))
    .Select(a => string.Join("-", a.ToArray()))
    .Distinct();

foreach (var str in result)
{
    Console.WriteLine(str);
}
Run Code Online (Sandbox Code Playgroud)

简而言之:将字符上的每个字符串拆分-为两个元素的数组.对每个数组进行排序,然后将它们连接在一起 然后,您可以简单地使用Distinct获取唯一值.

更新:在考虑更多时,我意识到您可以轻松删除其中一个Select调用:

var result = MyList
    .Select(s => string.Join("-", s.Split('-').OrderBy(s1 => s1).ToArray()))
    .Distinct();
Run Code Online (Sandbox Code Playgroud)

免责声明:此解决方案将始终将值"AB"保持在"BA"之上,而不管原始序列中出现的顺序如何.

  • Downvoters,请发表评论,以便纠正任何错误. (4认同)