//使用扩展方法删除集合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接口就行了,保证数据不会重复了。