使用Linq将List <String>与重复信息进行比较

 爱到最后还是分离_851 发布于 2023-02-09 19:19

为了比较两个List并提取他们的差异,我使用Linq的Except.

即:

假设我想使用Linq比较以下两个相等的列表:

List1 = "0,1,2,2,3"
List2 = "0,1,2,3"

List differences1 = List1.Except(List2).ToList();
List differences2 = List2.Except(List1).ToList();

differences1并且两个列表中differences2都没有项目2,但两个列表都不相等.我希望能够提取列表之间的所有差异,包括另一个没有的重复信息.

提取两个List对象之间所有差异的最佳方法是什么?

1 个回答
  • 所以你要找的是一个Except适用于包包,而不是套装.因此,如果一个序列有一个项目的2个副本并且您用一个副本减去一个集合,则应该剩下一个副本,而不是在执行减法之前将所有序列减少为不同的集合,如同Except.

    这使得处理起来稍微不那么优雅,但它仍然不是很糟糕.HashSet您只需要将项目映射到副本的数量,而不是在另一个集合中表示项目.然后对于每个项目,如果它在字典中,从计数中删除一个并且不产生它,如果它不在字典中那么它应该被产生.

    public static IEnumerable<T> BagDifference<T>(IEnumerable<T> first
        , IEnumerable<T> second)
    {
        var dictionary = second.GroupBy(x => x)
            .ToDictionary(group => group.Key, group => group.Count());
    
        foreach (var item in first)
        {
            int count;
            if (dictionary.TryGetValue(item, out count))
            {
                if (count - 1 == 0)
                    dictionary.Remove(item);
                else
                    dictionary[item] = count - 1;
            }
            else
                yield return item;
        }
    }
    

    2023-02-09 19:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有