【问题标题】:A new array out of some values from existing array来自现有数组的一些值的新数组
【发布时间】:2013-07-26 01:28:52
【问题描述】:

如果我得到一个像这样的数组:

string[] test = new string[5] { "hello", "world", "test", "world", "world"};

我怎样才能从相同的字符串中创建一个新数组,“世界”是你事先知道有多少的地方,这里是 3?

我在想这样的事情:

string[] newArray = new string[3];

        for (int i = 0; i < 5; i++)
        {
            if (test[i].Contains("world"))
            {
                newArray[i] = test[i];
            }
        }

问题出在这里:newArray[i] = test[i];

由于它是从 0 迭代到 4,所以会出现错误,因为 newArray 被限制为 3。

如何解决这个问题?

编辑:我需要它是来自测试(旧数组)的位置 1、3 和 4 应该存储在 newArray 中的 0、1 和 2。

【问题讨论】:

  • 你能像输入输入一样写出你想要的输出吗?这将帮助我们(至少是我)准确了解您想要什么。
  • @CédricBignon 我希望输出类似于“newArray 包含以下字符串:世界、世界、世界”。你是这个意思吗?
  • @Erik 更像是string[] output = new string[3] { "world", "world", "world"}。您想要什么作为以下输入 { "hello", "world", "hello", "hello", "test", "my world", "world"} 的输出?
  • @Erik:这正是 0 票赞成的 2 个答案从一开始就试图做的事情。不确定这是否是您真正想要的。
  • 那么我想要string[] output = new string[3] { "world", "world", "world"},因为它仍然是3个包含“世界”的字符串。谢谢。

标签: c# arrays string for-loop


【解决方案1】:

使用额外的辅助索引变量

    string[] newArray = new string[3];

    for (int i = 0, j = 0; i < 5; i++)
    {
        if (test[i].Contains("world"))
        {
            newArray[j++] = test[i];
            if (j >= newArray.Length)
                break;
        }
    }

【讨论】:

  • 如果有超过 3 个带有“world”的字符串,这将不起作用。编辑:没有看到问题说你已经知道有 3 个
  • @Alden:那是他的要求,不是我的。他在3处定义了数组。阅读他的问题条件,我只是在回答。
  • 或数组中超过5个元素,OP说如果他的数组是这样的,这意味着那不是他的实际数据
  • @Alden 问题说,“你事先知道有多少,这里有 3 个”。
  • 我个人认为它的编码很糟糕,包括在同一行中的两个 for 循环。我也仍然认为如果突然出现 4 个“世界”,您的代码将无法工作,OP 将不得不更新此代码,这很乏味且容易出错
【解决方案2】:

从技术上讲,这不是您的问题,但如果您希望根据具有相同单词的数组来加载数组,您可以这样做

test.GroupBy(x => x).ToList();

这将为您提供一个列表列表.. 使用您的测试数据,这将是

list1 - hello
list2 - world world world
list3 - test

示例使用

var lists =  test.GroupBy(x => x).ToList();
foreach(var list in lists)
{
     foreach(var str in list)
     {
         Console.WriteLine(str);
     } 
     Console.WriteLine();
}

【讨论】:

    【解决方案3】:

    您对testnewArray 使用相同的索引i。我建议你创建另一个计数器变量并增加它:

    string[] newArray = new string[3];
    int counter = 0;
    
    for (int i = 0; i < 5; i++)
    {
        if (test[i].Contains("world"))
        {
            newArray[counter] = test[i];
            counter++;
        }
    }
    

    【讨论】:

    • @Erik - 这会起作用,如果 counter >= newArray.Length,我也会进一步扩展它并跳出 for 循环
    • 再次抱歉。看错了,来晚了,呵呵。你的逻辑是对的,我看看能不能套用这个逻辑。
    • 接受了这一点,因为它在我的案例中是最简单的适用和可行的解决方案,尽管大多数答案都同样有效(有些甚至更好)。
    【解决方案4】:

    你想使用 Linq:

    var newArray = test.Where(x => x.Contains("world")).ToArray();
    

    【讨论】:

      【解决方案5】:

      改用List&lt;string&gt;

          List<string> newList = new List<string>();
      
          for (int i = 0; i < 5; i++)
          {
              if (test[i].Contains("world"))
              {
                  newList.Add(test[i]);
              }
          }
      

      如果你以后真的需要它作为一个数组..转换列表:

      string[] newArray = newList.ToArray();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-02
        • 2014-11-03
        • 2021-04-12
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        相关资源
        最近更新 更多