一道简单的C#测试题 C#Except

题目很简单

例如有2个集合

  List<string> listA = new List<string> { "a", "b", "c", "d", "e" };
            List<string> listB = new List<string> { "a", "b", "f" };

需要找出在listA中存在,在listB中不存在的元素。

实现方式一:

   List<string> b = new List<string>();
            foreach (var item in listA)
            {
                if (!listB.Contains(item))
                    b.Add(item);
            }

实现方式二

    IEnumerable<string> result = listA.Except<string>(listA.Intersect<string>(listB));

方式二的实现是借用了HashSet等价与

   ISet<string> setA = new HashSet<string>(listA);
            ISet<string> setB = new HashSet<string>(listB);
            setA.ExceptWith(setB);

实现方式三:如果listA,listB 都是有序,可以用更简单的方式来处理

  static List<T> ExceptWith<T>(List<T> from, List<T> except) where T : IComparable
        {
            List<T> resut = new List<T>();
            int fromindex, exceptindex, copyindex;
            fromindex = exceptindex = copyindex = 0;
            while ((fromindex < from.Count) && (exceptindex < except.Count))
            {
                int compar = ((IComparable)from[fromindex]).CompareTo(except[exceptindex]);
                if (compar < 0)
                {
                    fromindex++;
                }
                else if (compar > 0)
                {
                    exceptindex++;
                }
                else if (compar == 0)
                {
                    if (fromindex > copyindex)
                        CopyData(from, resut, copyindex, fromindex);
                    fromindex++;
                    copyindex = fromindex;

                }
            }
            CopyData(from, resut, copyindex, from.Count);
            return resut;
        }
        static void CopyData<T>(List<T> from, List<T> to, int startindex, int endindex)
        {
            if (from == null || to == null || startindex < 0 || endindex < 0 || endindex <= startindex) return;
            to.AddRange(from.Where((data, index) => index >= startindex && index < endindex));
        }
调用方式:       List<string> temp = ExceptWith<string>(new List<string>() { "a", "b", "c", "d", "e" }, new List<string>() { "a", "b", "f" });
            List<int> a = ExceptWith<int>(new List<int>() { 1, 3, 4, 7, 9, 11 }, new List<int>() { 4, 7 });

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值