weixin_42001881
weixin_42001881
采纳率100%
2020-08-26 14:59

有两个集合,删除一个集合中包含的另一个集合的数据,如何使用扩展方法删除?

5
已采纳

//使用扩展方法删除集合companies中的allcompanys的数据

 var allcompanys = companies.Where(x =>
                   nations.Where(z => z.OnArea == "Asia").
                   Any(z => cities.Where(o => o.OnNation == z.Chinese).Any(o => o.Chinese == x.OnCity))).ToList();
                companies.ForEach(x=> { allcompanys.Contains(x); }) ;

//这里已经找到了两个集合companies和allcompanys,想定义一个扩展方法RemoveList来直接删除,成为这样的companies.RemoveList(allcompanys);

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

5条回答

  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 7月前
    
    companies = companies.Except(companies.Where(x =>
                       nations.Where(z => z.OnArea == "Asia").
                       Any(z => cities.Where(o => o.OnNation == z.Chinese).Any(o => o.Chinese == x.OnCity))).ToList()).ToList();
    
    

    或者

    var allcompanys = companies.Where(x =>
                       nations.Where(z => z.OnArea == "Asia").
                       Any(z => cities.Where(o => o.OnNation == z.Chinese).Any(o => o.Chinese == x.OnCity))).ToList();
                    allcompanys.ForEach(x=>{ companies.Remove(x); }) ;
    
    点赞 3 评论 复制链接分享
  • heiheixiong wfcaxxx 7月前

    扩展方法类:
    public static class ListExtension
    {
    public static List RemoveList(this List instance,List parm)
    {
    try
    {
    instance.RemoveAll(item => parm.Contains(item));
    }
    catch
    { }
    return instance;
    }
    }
    测试类:
    class Program
    {

        static void Main(string[] args)
        {
            List<string> list1 = new List<string>() { "a", "b", "c", "d" };
            List<string> list2 = new List<string>() { "a", "d" };
            list1.RemoveList(list2);
            foreach (string str in list1)
            {
                Console.WriteLine(str);
            }
            Console.ReadKey(); 
        }
    
    }
    

    使用扩展方法有几个值得注意的地方:

    (1)扩展方法不能和调用的方法放到同一个类中

    (2)第一个参数必须要,并且必须是this,这是扩展方法的标识。如果方法里面还要传入其他参数,可以在后面追加参数

    (3)扩展方法所在的类必须是静态类

    (4)最好保证扩展方法和调用方法在同一个命名空间下

    点赞 1 评论 复制链接分享
  • lcmsx 乱臣贼子 7月前

    个人愚见,根据如果你的这个companies是啥类型来确定解决方案:
    1、如果companies是一个List泛型集合的话,你可以试试先对T对应类型重写Equals、GetHashCode两个方法(定义T类型实例的比较方法),然后用HashSet或者SortedSet集合将要合并的集合放进去就行了
    2、如果companies是一个你自己实现的集合(实现了ICollection),那么你只需要将你的集合实现ISet接口就行了,保证数据不会重复了。

    点赞 评论 复制链接分享
  • qiangguozhanlue 强国战略 7月前
    List<String> listFirst = new ArrayList();
    List<String> listSecond = new ArrayList();
    listFirst.add("1");
    listFirst.add("2");
    listFirst.add("3");
    
    listSecond.add("a");
    listSecond.add("b");
    listSecond.add("c");
    listSecond.add("1");
    // 集合listFirst移除集合listSecond 即 集合listFirst移除自身包含集合listSecond中的全部数据
    // 如果集合listFirst包含listSecond中的数据,则会全部移除。
    listFirst.removeAll(listSecond);
    
    点赞 评论 复制链接分享
  • jingluan666 jingluan666 7月前

    使用RemoveAll方法

                List<string> list1 = new List<string>() {"a","b","c","d" };
                List<string> list2 = new List<string>() { "a", "d" };
                list1.RemoveAll(item => list2.Contains(item));
    
    点赞 评论 复制链接分享