簡體   English   中英

如何從Dictionary中選擇/刪除元素 <string, List<string> &gt;基於一些標准

[英]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,並以編程方式構建。

  • Where選擇字典中列表包含多個項目的所有鍵/值對。
  • Select I已刪除,因為它實際上不再需要了。 :)
  • 聚合收集對並為每個項目執行添加(將其添加到列表中)。 你也可以在這里使用.ToDictionary(...)

如果需要對子列表進行排序,請將item.Value更改為item.Value.Sort(s => s).ToList()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM