【问题标题】:How can I initialize a 2-d C# array to all of the same value?如何将二维 C# 数组初始化为所有相同的值?
【发布时间】:2016-12-09 23:55:19
【问题描述】:

下面的评论中描述了我想要做的事情。我该怎么做,高效?

using System;
using System.Collections.Generic;
using System.IO;
class Solution {
    static void Main(String[] args) {
        int n = Int32.Parse(Console.ReadLine());
        bool[][] flags = new bool[26][n]; // I want this to be a 26 x n array of false values
        for(int k = 0; k < n; ++k)
        {
            string line = Console.WriteLine();
            for(int i = 0; i < line.Length; ++i)
                flags[(int)line[i] - (int)'a'] = true;
        }
        int gems = flags.Count(arr => arr.Count(j => j == true) == arr.Length);       
        Console.WriteLine
    }
}

【问题讨论】:

标签: c# .net arrays algorithm data-structures


【解决方案1】:

LINQ 应该可以很好地实现您的目标:

bool[][] flags = Enumerable.Range(0, 26).Select(_ => Enumerable.Repeat(true, n).ToArray()).ToArray();

或者正如吉姆·米歇尔所说:

bool[][] flags = Enumerable.Repeat(Enumerable.Repeat(true, n).ToArray(), 26).ToArray();

但第一个示例使用较少的内存,因为 Select 方法在遍历项目时不会重新定义 Enumerable.Repeat(true, n).ToArray()

【讨论】:

  • 可以简化为flags = Enumerable.Repeat(Enumerable.Repeat(true, n).ToArray(), 26).ToArray();
  • flags = Enumerable.Repeat(Enumerable.Repeat(true, n).ToArray(), 26).ToArray(); 不正确,因为它只会创建一次“内部”数组,然后将使用对它的引用来初始化“行”。因此,当您修改时,例如 [0][0],您将在 [1][0],.. [n][0] 中看到相同的值。
【解决方案2】:

您似乎对 Multidimensional 数组和 Jagged Array(数组数组)感到困惑。

如果您正在寻找二维数组,您可以这样做。

bool[,] flags = new bool[26,n]; 
//or
bool[,] flags = new bool[,]; 
bool[,] flags = new bool[26,]; 

如果是锯齿状数组,你可以这样做。

bool[][] flags1 = new bool[26][];
flags1[0] = new bool[n];  // since you want n elements 
flags1[1] = new bool[n];
...

// initialization
flags1[0] = new bool[] {true, false};
flags1[1] = new bool[] {false};

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多