C#测试题:C#Except

本文介绍了三种方法来找出在第一个集合中存在而在第二个集合中不存在的元素,包括循环遍历、使用Enumerable的Except和Intersect方法,以及针对有序集合的优化算法。文章详细解释了每种方法的实现过程及适用场景。

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

题目很简单

例如有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 都是有序,可以用更简单的方式来处理

[csharp]
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 });

转载于:https://www.cnblogs.com/yl20021205/archive/2012/08/31/2665123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值