Reputation: 18461
There is a List<int>
containing some set of numbers. Randomly I select an index, which will be processed separately (call it master). Now, I want to exclude this particular index, and get all other elements of List
(call them slave).
var items = new List<int> { 55, 66, 77, 88, 99 };
int MasterIndex = new Random().Next(0, items .Count);
var master = items.Skip(MasterIndex).First();
// How to get the other items into another List<int> now?
/* -- items.Join;
-- items.Select;
-- items.Except */
Join
, Select
, Except
- any of them, and how?
EDIT: Cannot remove any item from the original list, otherwise I have to keep two lists.
Upvotes: 27
Views: 31005
Reputation: 8369
If performance is an issue you may prefer to use the List.CopyTo method like this.
List<T> RemoveOneItem1<T>(List<T> list, int index)
{
var listCount = list.Count;
// Create an array to store the data.
var result = new T[listCount - 1];
// Copy element before the index.
list.CopyTo(0, result, 0, index);
// Copy element after the index.
list.CopyTo(index + 1, result, index, listCount - 1 - index);
return new List<T>(result);
}
This implementation is almost 3 times faster than @RahulSingh answer.
Upvotes: 5
Reputation: 21825
Use Where:-
var result = numbers.Where((v, i) => i != MasterIndex).ToList();
Working Fiddle.
Upvotes: 47
Reputation: 8892
You could remove Master item from the list,
List<int> newList = items.RemoveAt(MasterIndex);
RemoveAt() removes the item from the original list, So it's not necessary to assign the collection to a new list. After calling RemoveAt(), items.Contains(MasterItem)
would return false
.
Upvotes: 4