【问题标题】:Most efficient way to compare two lists and delete the same比较两个列表并删除相同列表的最有效方法
【发布时间】:2016-05-17 21:30:30
【问题描述】:

我想比较两个列表并将有效单词放入一个新列表中。

var words = new List<string>();
var badWords = new List<string>();

//this is just an example list. actual list does contain 700 records
words.Add("Apple");
words.Add("Moron");
words.Add("Seafood");
words.Add("Cars");
words.Add("Chicken");
words.Add("Twat");
words.Add("Watch");
words.Add("Android");
words.Add("c-sharp");
words.Add("Fool");

badWords.Add("Idiot");
badWords.Add("Retarded");
badWords.Add("Twat");
badWords.Add("Fool");
badWords.Add("Moron");

我正在寻找最有效的方法来比较列表并将所有“好”词放入一个新列表中。 finalList 不应包含“Moron”、“Twat”和“Fool”。

var finalList = new List<string>();

或者不需要创建一个新的列表?我很高兴听到你的想法!

提前谢谢你

【问题讨论】:

  • “最有效” 你的意思是“时间”还是“内存使用”或两者的组合或其他。 en.wikipedia.org/wiki/Algorithmic_efficiency
  • @MickyD 我的意思是时间。对不起,我应该问得更准确
  • list1.Enumerable.Except(list2) 将返回list1 中所有不在list2 中的元素。见docs

标签: c# list compare .net-4.5


【解决方案1】:

使用EnumerableExcept函数存储在System.Linq命名空间

finalList = words.Except(badWords).ToList();

节省时间的最有效方式也是最快的方式,因为Except 实现使用Set,速度很快

【讨论】:

  • ...和执行时间。这使用一个集合来存储所有项目。它将在 O(n+m) 中运行。我不认为会有更快的方法来做到这一点。
  • 我肯定会采用这种方法。但是,根据列表的大小,可能会有更快的方法。对于像给定的那些小列表,一个简单的循环可能会更快。我强烈怀疑实际问题的列表要长得多,这使得这个解决方案是最好的。
  • 请注意 - 您的 msdn 链接是俄语的。
  • @KonstantinZadiran 不用担心 - +1 以获得清晰的答案
【解决方案2】:

使用Enumerable.Except:

List<string> cleanList = words.Except(badWords).ToList();

这很有效,因为Except 使用基于集合的方法。

更有效的方法是完全避免将“坏”词添加到第一个列表中。例如,将HashSet&lt;string&gt; 与不区分大小写的比较器一起使用:

var badWords = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase){ "Idiot", "Retarded", "Twat", "Fool", "Moron" };

string word = "idiot";
if (!badWords.Contains(word))
    words.Add(word);

【讨论】:

  • 感谢您的解释。我一定会考虑使用 Hashset 的方法
【解决方案3】:

你可以使用 contains 方法

words.Where(g=>!badWords.Contains(g)).ToList()

【讨论】:

    【解决方案4】:

    https://msdn.microsoft.com/library/bb908822(v=vs.90).aspx

    var words = new List<string>();
    var badWords = new List<string>();
    
    //this is just an example list. actual list does contain 700 records
    words.Add("Apple");
    words.Add("Moron");
    words.Add("Seafood");
    words.Add("Cars");
    words.Add("Chicken");
    words.Add("Twat");
    words.Add("Watch");
    words.Add("Android");
    words.Add("c-sharp");
    words.Add("Fool");
    
    badWords.Add("Idiot");
    badWords.Add("Retarded");
    badWords.Add("Twat");
    badWords.Add("Fool");
    badWords.Add("Moron");
    
    var result = words.Except(badWords).ToList();
    

    编辑:迟到了。

    【讨论】:

      【解决方案5】:

      如果您不想创建新的List,您可以使用RemoveAll() 从现有的List 中删除坏词

      words.RemoveAll(badWords.Contains);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多