![](/img/trans.png)
[英]How to select many distinct elements on List<Dictionary<string, string>>?
[英]How to select/remove elements from a Dictionary<string, List<string>> based on some criteria
當list<string>
的計數小於或等於1時,我試圖從C#中的Dictionary<string, List<string>>
中刪除元素。我得到了一些代碼,但它不優雅,我有一個直覺感覺這可以在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;
為了將問題放在上下文中我試圖從字典中找到字謎,如果排序的鍵具有多個與之關聯的值 ,我認為單詞具有字謎。
您確實可以使用LINQ執行此操作:
Dictionary<string, List<string>> FindAnagrams(List<string> dictionary)
{
return dictionary
.GroupBy(w => new string(((IEnumerable<char>)w).OrderBy(c => c).ToArray()))
.Where(g => g.Count() > 1)
.ToDictionary(g => g.Key, g => g.ToList());
}
這個怎么運作:
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,並以編程方式構建。
.ToDictionary(...)
。 如果需要對子列表進行排序,請將item.Value
更改為item.Value.Sort(s => s).ToList()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.