从数组中删除一个元素并将其他元素向后移动。

4

我来直接说明吧。我想把一个数组中的项目按照统一差异移动,比如说我有这个。

string[] fruits = { "Banana", "Apple", "Watermelon", "Pear", "Mango" };

例如,假设我想删除“苹果”,那么我会这样做。
fruits[1] = "";

现在剩下的只有:
{ "Banana", "", "Watermelon", "Pear", "Mango" }

我该如何真正删除苹果部分,只留下:

{ "Banana", "Watermelon", "Pear", "Mango" }

注意,从“西瓜”到数组末尾的所有项的索引向后移动1。有什么想法吗?

3
请不要建议使用非泛型容器,如ArrayList,而应该使用泛型的List<T>! - abatishchev
问题是,这是一个团队项目。我的朋友们开始了这个项目并使用了数组。我不能只是重新开始项目来改变应用程序使用列表。 - Naufal Fikri
@MortenAnderson,除非你在使用.NET 1,否则真的没有必要使用ArrayList。 - Ray
@Naufal:实际上,您可以使用 T[] arr = list.ToArray();。而且,当您需要一个灵活的容器时,请使用 List<T>。如果您需要固定大小,请使用 T[] - abatishchev
7个回答

9
< p > List 类是您需要的类。它提供了一个 Remove 方法,可以自动将后续元素向后移动。


好的,我的团队已经允许我将数组改为列表,我会使用它。 - Naufal Fikri

6

如果您确实想使用数组,可以使用Linq过滤列表并转换为数组:

  string[] fruits = { "Banana", "Apple", "Watermelon", "Pear", "Mango" };

  fruits = fruits.Where(f => f != "Apple").ToArray();

如果不必使用数组,可以使用List类。列表允许添加和删除项目。

这将删除所有的“Apple”。 - Moonlight
我会尝试这个,因为每个项目只包含一个。 - Naufal Fikri

2

与Wouter的答案类似,如果您想按项索引而不是项值进行删除,则可以执行以下操作:

fruits = fruits.Where((s, i) => i != 1).ToArray();

1

我认为新程序员可以做的最有用的事情之一就是学习和理解各种集合类型。

尽管我认为其他人提到的列表选项可能是您想要的,但如果您需要大量插入和删除而不是按索引查找,则值得查看LinkedList类。


1
你可以像这样做:
for( int i = 1;  i + 1 < fruits.Length;  i++ )
    fruits[i] = fruits[i + 1];
fruits = System.Array.Resize( fruits, fruits.Length - 1 );

如果您不关心数组中水果的顺序,更聪明的做法是如下所示:
fruits[1] = fruits[fruits.Length - 1];
fruits = System.Array.Resize( fruits, fruits.Length - 1 );

我知道......实际上我的程序是一个喜爱的水果采摘器。我知道水果是不可数的,所以它有另一个数组。在我的应用中,水果实际上代表“水果特供”。 - Naufal Fikri
C-:= 你知道吗,30年前我学英语的时候,我学到它是不可数名词。但是我现在查了一下,确保我没有说错话,dictionary.com说复数形式是fruits。所以我不知道这是不是美国习语(当时我学的是英式英语),还是语言已经改变了。因此,我从我的答案中删除了那部分内容。 - Mike Nakis
@Naufal:你肯定需要使用 List<T> - abatishchev
1
@Mike:有趣的笔记。我决定谷歌一下,并找到了这个维基词典条目 - abatishchev
MikeNakis,我的老师告诉我水果的复数形式是水果。她是美国人,我现在很困惑,而且如果你在MS Word中键入“fruits”,不会显示拼写错误(红色下划线)。abatishchev 发现得不错。 - Naufal Fikri
这个问题已经在StackExchange上讨论过了:http://english.stackexchange.com/questions/25147/is-using-fruits-as-the-plural-of-fruit-acceptable - Mike Nakis

0
作为三年前的初学者,我开始制作我今天仍在使用的软件。我在游戏中使用了一个“PartyMembers”的数组,现在我基本上后悔了,并且不得不花费大量时间将所有这些硬编码的$#!t转换成列表。
重点是,如果可以,请使用列表,与数组相比,它们更易于处理。

0

这是一个使用列表和数组从数组中删除项的示例。请注意,我还向您展示了如何使用LINQ搜索包含不良名称以进行删除。希望这能帮助到某些人。

public static void CheckBadNames(ref string[] parts)
    {
        string[] BadName = new string[] {"LIFE", "ESTATE" ,"(",")","-","*","AN","LIFETIME","INTREST","MARRIED",
                                         "UNMARRIED","MARRIED/UNMARRIED","SINGLE","W/","/W","THE","ET",
                                         "ALS","AS", "TENANT" };

        List<string> list = new List<string>(BadName); //convert array to list

        foreach(string part in list)
        {
            if (BadName.Any(s => part.ToUpper().Contains(s)))
            {
                list.Remove(part);
            }
        }

        parts = list.ToArray(); // convert list back to array
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接