2013-01-03 61 views
3

我有Arraylist包含所有屬性的ID(list1)。現在我有另一套屬性的IDS(列表2),它需要從第一的ArrayList(列表1)刪除使用LINQ刪除ArrayList中的項目集合

我在初學階段的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輸出只有 在此先感謝!

+7

你真的需要使用ArrayList而不是泛型集合嗎? –

+0

如果它是列表,您可以使用「Except」。 – Sandeep

+0

Linq不會從可枚舉(集合)中移除某些東西。它創建一個新的枚舉,您可以在其中排除某些項目。它通常(總是)導致一個新的集合。 – Maarten

回答

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

+0

我想你的意思是'Cast ',此時​​你可以刪除'Convert.ToInt32'調用。 –

+0

@JonSkeet - quetion對我來說並不那麼清楚,但我認爲...他想要在ArrayList中轉換linq qunery的輸出,所以我嘗試了上面的代碼 –

+0

@JonSkeet - 我希望我的編輯現在有一定道理...... –

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

像喬恩提到的,你應該考慮只使用一個簡單的數組或泛型集合。另請注意,上述查詢以O(n * m)運行,其中n是原始列表中項目的數量,m是您嘗試刪除的列表中元素的數量。您應該考慮使用HashSet,然後使用設置的差異操作來獲得更好的性能。

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手段「只選擇那些出現在這兩組元件」

(如其它地方所提到的,相交是非最優的大型數據集:考慮使用適當的結構,像一個HashSet)

0

解決您的問題是:

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

ArrayList secondList = new ArrayList(new int [] {1,3}); ()select n).Contains(c)select c;(); //從第一個列表中的第一個列表中選擇第一個列表。

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

輸出以上是:2 7 8 9即從第一個列表中移除secondList的項目,結果也是您需要獲取的ArrayList。