使用LINQ从ArrayList中删除一组项目

时间:2013-01-03 06:55:39

标签: c# linq

我有Arraylist,其中包含所有属性的ID(list1)。现在我有另一组属性的ID(list2)需要从第一个ArrayList(list1)中删除

我作为LINQ开发人员处于初学阶段,因此请建议正确的代码段

Arraylist attributeIDs; // which contains Ids
int[] ids = { 1, 2, 3, 4 };
var id = ids.Select(s => s);
var sam = attributeIDs.Cast<IEnumerable>().Where(s => id.Contains(Convert.ToInt32(s)));
Arraylist filterAttributDs = Cast<Arraylist>sam;

在上面的代码之后,我需要将输出Arraylist转移到不同的方法,所以我只需要在Arraylist中输出 提前谢谢!

4 个答案:

答案 0 :(得分:3)

试用方法

var sam = attributeIDs.Cast<IEnumerable>().Where(s => id.Contains(Convert.ToInt32(s)));
ArrayList myArrayList = new ArrayList(sam );

编辑

int[] ids = { 1, 2, 3, 4 };
//var id = ids.Select(s => s);
List<int> id = ids.OfType<int>().ToList();
var list = attributeIDs.Cast<int>().ToList();
//or try 
//List<int> list = new List<int>(arrayList.ToArray(typeof(int)));
var sam = list.Where(s => id.Contains(s));
//if you want to remove items than , !Contains() rather an Contains()
// var sam = list.Where(s => !id.Contains(s); 
//also try out Intersect or Except instead of this as jon suggestion in comment 
//var sam= attributeIDs.Except(id); for diffence between list
//var sam= attributeIDs.Intersect(id); for common in list


ArrayList myArrayList = new ArrayList(sam );

结合所有

选中此项:LINQ to SQL in and not in

答案 1 :(得分:1)

new Arraylist((from id in attributeIDs where !ids.Contains(id) select id).ToList())

就像Jon提到的那样,你应该考虑使用简单的数组或泛型集合。另请注意,上述查询在O(n * m)中运行,其中n是原始列表中的项目数,m是您尝试删除的列表中的元素数。您应该考虑使用HashSet,然后在此处使用set difference操作以获得更好的性能。

答案 2 :(得分:1)

对你的例子稍作调整:

ArrayList attributeIDs = new ArrayList(){ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] ids = { 1, 2, 3, 4 };
var sam = attributeIDs.Cast<int>().Intersect(ids);

一些注意事项:

  • Cast投射基础项目类型,而不是集合的类型。

  • foo = setOfThings.Select(a => a) <==> setOfThings

  • Intersect表示&#34;仅选择出现在两个集合中的元素&#34;

(如其他地方所述,Intersect对于大型数据集不是最佳的:考虑使用适当的结构,如HashSet)

答案 3 :(得分:0)

解决您的问题的方法是:

ArrayList firstList = new ArrayList(new int [] {1,2,3,7,8,9}};

ArrayList secondList = new ArrayList(new int [] {1,3});

var result =来自firstList.ToArray()中的c其中!(来自secondList.ToArray()中的n选择n).Contains(c)select c;

foreach(结果中的var temp)   Console.WriteLine(温度);

以上的OutPut是:2 7 8 9 ,即第二个列表的项目将从firstList中删除,结果也是您需要获取的ArrayList。