【问题标题】:Remove set of items from ArrayList using LINQ使用 LINQ 从 ArrayList 中删除一组项目
【发布时间】:2013-01-03 06:55:38
【问题描述】:

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

我作为 LINQ 开发人员处于初学者阶段,所以请建议正确的代码 sn-p

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 中输出 提前致谢!

【问题讨论】:

  • 真的需要使用ArrayList而不是通用集合吗?
  • 如果它是 List,您可以使用“Except”。
  • Linq 不会从可枚举(集合)中删除某些内容。它用于创建一个新的可枚举项,您可以在其中排除某些项目。它通常(总是)产生一个新的集合。

标签: c# linq


【解决方案1】:

试试方法

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

【讨论】:

  • 我认为您的意思是Cast&lt;int&gt;,此时您可以删除Convert.ToInt32 调用。
  • @JonSkeet - 问题对我来说不是很清楚,但我认为......他想在 ArrayList 中转换 linq qunery 的输出,所以我尝试了上面的代码
  • 嗯,不清楚为什么你还有第一部分,这肯定行不通。另外,请考虑IntersectExcept...
【解决方案2】:
new Arraylist((from id in attributeIDs where !ids.Contains(id) select id).ToList())

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

【讨论】:

    【解决方案3】:

    对您的示例稍作调整:

    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 =&gt; a) &lt;==&gt; setOfThings

    • Intersect 表示“只选择同时出现在两个集合中的那些元素”

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

    【讨论】:

      【解决方案4】:

      您的问题的解决方案是:

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

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

      var result = from c in firstList.ToArray() where !(from n in secondList.ToArray() select n).Contains(c) select c;

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

      上面的输出是:2 7 8 9 即 secondList 的项目从 firstList 中删除,结果也是您需要的 ArrayList。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 2014-03-08
        • 1970-01-01
        • 2010-10-17
        • 2023-03-15
        • 2013-08-31
        相关资源
        最近更新 更多