c# - 如何根据某些条件从 Dictionary<string, List<string>> 中选择/删除元素

标签 c# linq string refactoring

我正在尝试从 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/

相关文章:

java - 断线器应用

c# - 当每个请求都需要新的授权 header 时,在 Web 应用程序中重用 HttpClient

c# - 具有缩放、水平滚动和居中内容的 WinRT ItemsControl

c# - 从数据库中获取字段值的动态 LINQ 查询

C# DateTime.Parse 错误

python - 在每第二次出现未知元素后拆分字符串

c# - 简单示例子查询 Linq

sql - 将 "DBML"文件转换为 "SQL database file"

c# - 如果任何列值为空,则删除数据表行c#

时间:2019-03-08 标签:c++sizeof(string)