【问题标题】:Removing one items from an array and moving the others backwards从数组中删除一项并将其他项向后移动
【发布时间】:2011-12-28 12:38:26
【问题描述】:

我会直奔主题。我想以统一的差异移动数组中的项目,假设我有这个。

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

例如,假设我想删除“Apple”,所以我会这样做。

fruits[1] = "";

现在剩下的就是:

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

我如何真正地删除 Apple 部分并仅获取:

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

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

【问题讨论】:

  • @Morten:请永远不要建议使用像 ArrayList 这样的非通用容器。请改用通用List<T>
  • 问题是,这是一个团队合作项目。我的朋友们开始了这个项目并使用了数组。我不能只是重新启动项目来将应用程序更改为使用列表。
  • @MortenAnderson 真的没有必要每次都使用 ArrayList(除非你使用的是 .NET 1)。
  • @Naufal:其实你可以使用T[] arr = list.ToArray();。此外,当您需要灵活的容器时,请使用List<T>。如果您需要固定大小,请使用T[]

标签: c# .net arrays


【解决方案1】:

List 课程最适合您。它提供了一个方法Remove,可以自动向后移动后面的元素。

【讨论】:

  • 好的,我的团队允许我将数组更改为列表,我将使用它。
【解决方案2】:

如果你真的想使用数组,你可以使用Linq过滤你的列表并转换为数组:

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

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

如果您不需要使用数组,请查看List class。列表允许添加和删除项目。

【讨论】:

  • 这将删除所有“Apple”
  • 我会试试这个,因为我将只包含一个项目。
【解决方案3】:

类似于 Wouter 的回答,如果您想按项目索引而不是项目值删除,您可以这样做:

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

【讨论】:

    【解决方案4】:

    你可以这样做:

    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 );
    

    【讨论】:

    • 我知道....实际上我的程序是最喜欢的水果采摘器。我知道水果是不可数的,所以它有另一个数组。在我的应用程序中,fruits 实际上代表 Fruit Special。
    • C-:= 你知道,30年前我学英语的时候,我就知道它是不可数的。但我刚才查了一下,以确保我没有说错话,dictionary.com 说复数是水果。所以我不知道这是否是一个美国成语,(当时我学的是英式英语)或者从那以后语言是否发生了变化。所以,我从我的答案中删除了那部分。
    • @Naufal:你肯定需要使用List&lt;T&gt;
    • @Mike:有趣的注释。我决定google,发现this WikiDictionary entry
    • MikeNakis,我的老师告诉我,水果的复数形式是水果。她是美国人,我现在很困惑,如果你在 MSWs Woord 中输入“fruits”,将不会显示拼写错误(红色下划线)。 abatishchev 不错的发现
    【解决方案5】:

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

    虽然我认为其他人提到的 List 选项可能是您正在寻找的,但如果您正在执行大量插入和删除操作而不是通过索引进行大量查找,则值得查看 LinkedList 类。

    【讨论】:

      【解决方案6】:

      这是我如何使用列表和数组从数组中删除项目的示例。请注意,我还向您展示了如何使用 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
          }
      

      【讨论】:

        【解决方案7】:

        3 年前,作为一名初学者,我开始制作我至今仍在开发的软件。我为游戏的“PartyMembers”使用了一个数组,我今天基本上后悔了,不得不花费大量时间将所有这些硬编码的 $#!t 转换为一个列表。

        举个例子,如果可以的话,就使用列表,相比之下,数组是一场噩梦。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-01
          • 2020-04-28
          • 1970-01-01
          相关资源
          最近更新 更多