我正在尝试从 Dictionary<string, List<string>>
中删除元素在 C# 中,当 list<string>
计数时小于或等于 1。
我有一些代码可以工作,但它并不优雅,我有一种直觉,这可以在 linq 中优雅地完成。
这是我现在的代码
Dictionary<string,List<string>> FindAnagrams(List<string> dictionary)
{
Dictionary<string, List<string>> anagrams = new Dictionary<string, List<string>>();
foreach (string word in dictionary)
{
char[] charArray=word.ToCharArray();
Array.Sort(charArray);
string sorted=new string(charArray);
if (anagrams.ContainsKey(sorted))
anagrams[sorted].Add(word);
else
anagrams.Add(sorted, new List<string>() { word });
}
List<string> nonAnagrams = new List<string>();
foreach (var sorted in anagrams.Keys)
if (anagrams[sorted].Count == 1)
nonAnagrams.Add(sorted);
foreach(string word in nonAnagrams)
anagrams.Remove(word);
return anagrams;
}
下面是我使用 linq 的进展情况,但这行不通。
var realAna = from keys in anagrams.Keys
where anagrams[keys].Count >1
select anagrams.values;
为了将问题放在上下文中,我试图从字典中查找变位词,如果排序的键具有多个与之关联的值,我认为一个词具有变位词。
最佳答案
var anagrams = new Dictionary<string, IList<string>>()
{
{"hello", new List<string>(){"hello", "helol", "hlelo"}},
{"hi", new List<string>(){"hi"}},
{"me", new List<string>(){"me", "em"}}
};
var a2 = anagrams
.Where(x => x.Value.Count > 1)
.Aggregate(new Dictionary<string, IList<string>>(),
(acc, item) => { acc.Add(item.Key, item.Value); return acc; });
这使用非查询形式的 linq,并以编程方式构建。
- Where 选择字典中包含多个项目的所有键/值对。
- 我删除的 Select 是因为实际上不再需要它了。 :)
- 聚合 收集对并为每个项目执行添加(将其添加到列表中)。您也可以在此处使用
.ToDictionary(...)
。
如果您需要对子列表进行排序,请将 item.Value
更改为 item.Value.Sort(s => s).ToList()
关于c# - 如何根据某些条件从 Dictionary<string, List<string>> 中选择/删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621388/