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


//使用扩展方法删除集合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);


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); }) ;

使用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));

扩展方法类:
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)最好保证扩展方法和调用方法在同一个命名空间下

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);

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