比较两个List列表,取得List中不同项返回

本文介绍了一个用于版本控制中实体对比的小工具方法,该方法通过比较新旧列表中的实体模型及其属性来找出不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        /// <summary>
        /// 比对模型及属性数组
        /// </summary>
        /// <typeparam name="TM"></typeparam>
        /// <param name="newList"></param>
        /// <param name="oldList"></param>
        /// <param name="keyField">模型Id</param>
        /// <param name="keyArrField">模型可转换数组</param>
        /// <returns></returns>
        public static List<TM> CompareList<TM>(List<TM> newList, List<TM> oldList, string keyField,
            string[] keyArrField)
        {
            List<TM> list = new List<TM>();

            foreach (TM newModel in newList)
            {
                object nob = newModel.GetType().GetProperty(keyField).GetValue(newModel, null);
                TM oldmodel = oldList.Find((delegate(TM old)
                {
                    object ob = old.GetType().GetProperty(keyField).GetValue(old, null);
                    if (object.Equals(ob, nob)) return true;
                    else return false;
                }));
                if (oldmodel == null)
                {
                    list.Add(newModel);
                }
                else
                {
                    PropertyInfo[] pi = oldmodel.GetType().GetProperties();
                    foreach (PropertyInfo p in pi)
                    {
                        object o_new = p.GetValue(newModel, null);
                        object o_old = p.GetValue(oldmodel, null);

                        if (keyArrField?.Contains(p.Name) ?? false)
                        {
                            if (o_new.IsNotNull() && o_old.IsNotNull())
                            {
                                var o_old_list = o_old.ToString().SplitList();
                                var o_new_list = o_new.ToString().SplitList();
                                if (o_old_list.Except(o_new_list).Any() ||
                                    o_new_list.Except(o_old_list).Any())
                                {
                                    list.Add(newModel);
                                    break;
                                }
                                else
                                    continue;
                            }
                            else if ((o_new == null || o_new.ToString() == string.Empty) && (o_old == null || o_old.ToString() == string.Empty))
                            {
                                continue;
                            }
                            else
                            {
                                list.Add(newModel);
                                break;
                            }
                        }
                        else
                        {
                            if (object.Equals(o_new, o_old))
                                continue;
                            else
                            {
                                list.Add(newModel);
                                break;
                            }
                        }

                    }
                }
            }

            return list;
        }

  做版本时候,需要对很多实体做比对,写了这个小工具。

转载于:https://www.cnblogs.com/DjangoBlogs/p/6386085.html

### Python 找出两个 `list` 的交集元素 在 Python 中,有多种方法可以找出两个列表的交集元素。以下是几种常见的方式: #### 使用集合操作 通过将列表转换成集合再执行交集操作是一种高效的方法。 ```python def get_intersection_with_set(list1, list2): set1 = set(list1) set2 = set(list2) intersection = set1.intersection(set2) # 或者使用 & 运算符:set1 & set2 return list(intersection) arr1 = [1, 2, 3, 4, 5] arr2 = [3, 4, 5, 6, 7] print(get_intersection_with_set(arr1, arr2)) ``` 这种方法简单快捷,但是会丢失原始顺序,并且无法保留重复[^3]。 #### 使用计数器(Counter) 如果希望不仅得到交集中存在的元素而且要获取这些元素出现的具体次数,则可以借助于 `collections.Counter` 类来完成此任务。 ```python from collections import Counter def get_intersection_with_counter(nums1, nums2): counter1 = Counter(nums1) counter2 = Counter(nums2) common_elements = counter1 & counter2 # 取得最小频率作为公共部分 result = list(common_elements.elements()) return result arr1 = [1, 2, 2, 3, 4, 5] arr2 = [2, 2, 3, 4, 5, 6, 7] print(get_intersection_with_counter(arr1, arr2)) ``` 这段代码能够保持每个元素的实际数量不变并返回它们组成的列表[^4]。 #### 排序加双指针法 对于已经排序过的列表来说,采用双指针技术可以在 O(n+m) 时间复杂度内解决问题;而对于未排序的情况则需先对其进行排序处理后再应用该算法。 ```python def sorted_two_pointer_intersect(sorted_list1, sorted_list2): i, j = 0, 0 intersection = [] while i < len(sorted_list1) and j < len(sorted_list2): if sorted_list1[i] == sorted_list2[j]: intersection.append(sorted_list1[i]) i += 1 j += 1 elif sorted_list1[i] < sorted_list2[j]: i += 1 else: j += 1 return intersection sorted_arr1 = [1, 2, 3, 4, 5] sorted_arr2 = [3, 4, 5, 6, 7] print(sorted_two_pointer_intersect(sorted_arr1, sorted_arr2)) ``` 上述三种方式各有优劣,在实际开发过程中可根据具体情况选择最合适的一种实现方案[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值