开发者

How to delete multiple entries from a List without going out of range?

I have a list of integers that contains a number of values (say, 200).

List<int> ExampleList;

And another list on integers that holds the indexes that need to be deleted from ExampleList. However, this list is not sorted.

List<int> RemoveFromExampleList;

If it were sorted, I would have run a reverse loop and deleted all the values like this:

for (int i = (RemoveFromExampleList.Count-1); i >=0; i--)
{
    ExampleList.RemoveAt(RemoveFromExampleList[i]);
}

Do I have to sort RemoveFromExampleList, or is there another way to prune the unnecessary values from ExampleList?

If I do have to sort, whats 开发者_运维问答the easiest way to sort? Is there any inbuilt C# library/method to sort?


If RemoveFromExampleList is a list of indexes, you would have to sort it and work in descending order to delete based on those indexes. Doing it any other way would cause you to delete values you don't mean to delete.


Here is the one liner.

ExampleList.RemoveAll(x => RemoveFromExampleList.Contains(ExampleList.IndexOf(x)));


You could replace the values you are going to remove with a sentinel value, i.e., one that you know doesn't occur in the list, and then remove all occurrences of that value.


Your option is to sort, yes. Sort the removal list in descending order and then remove by index that way.

// perform an orderby projection, remove
foreach (int index in RemoveFromExampleList.OrderByDescending(i => i)
    ExampleList.RemoveAt(index);

Or

// actually sort the list, then remove
RemoveFromExampleList.Sort((a,b) => b.CompareTo(a));
foreach (int index in RemoveFromExampleList)
    ExampleList.RemoveAt(index);

(Assumes there are no duplicates, use .Distinct() on the list/projection if otherwise.)


If you really had some aversion to sorting the list, you could make the list a list of nullable ints:

List<int?> ints;

Then you could nullify the values in the "delete list", and use the RemoveAll method to delete the null values.

But this is obviously a bit of a hack.


You could do it with LINQ / Lambda like so:

//EXAMPLE TO REMOVE ITEMS COMING FROM ANOTHER LIST List masterList = new List(); masterList.Add(1); masterList.Add(1); masterList.Add(2); masterList.Add(3);

        List<int> itemsToRemove = new List<int>();
        itemsToRemove.Add(1);
        itemsToRemove.Add(2);
        itemsToRemove.Add(3);

        List<int> cleanList = new List<int>();
        foreach (int value in itemsToRemove)
        {
            masterList = masterList.Where(x => x != value).ToList();
        }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜