web-dev-qa-db-ja.com

C#で空の配列を初期化する方法

サイズを指定せずに空の配列を作成することは可能ですか?

たとえば、私は作成しました:

String[] a = new String[5];

上記の文字列配列をサイズなしで作成できますか?

265
yogesh

事前にサイズがわからないコレクションを使用する場合は、配列よりも優れたオプションがあります。

代わりにList<string>を使用します-必要な数の項目を追加でき、配列を返す必要がある場合は、変数でToArray()を呼び出します。

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

must空の配列を作成する場合、これを行うことができます:

string[] emptyStringArray = new string[0]; 
387
Oded

これを試して:

string[] a= new string[] { };
155
hemant

.Net 4.6では、推奨される方法は新しいメソッド Array.Empty を使うことです

String[] a = Array.Empty<string>();

実装 は簡潔で、 を使用して総称クラスの静的メンバが.Net でどのように動作するか

public static T[] Empty<T>()
{
    return EmptyArray<T>.Value;
}

// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
    public static readonly T[] Value = new T[0];
}

(コード契約に関連するコードは明確にするために削除されています)

また見なさい:

78
Kobi

サイズを0にして初期化することもできますが、配列に追加できないため、サイズが何であるかがわかっている場合は再初期化する必要があります。

string[] a = new string[0];
29
MatthiasG

サイズなしで配列を宣言しても意味がありません。配列サイズに近い特定のサイズの配列を宣言するときは、物を保持できるコレクション内で使用可能な固定数のスロットを指定します。したがって、メモリが割り当てられます。何かを追加するには、とにかく既存の配列を再初期化する必要があります(配列のサイズを変更している場合でも、 このスレッドを参照してください )。空の配列を初期化したいというまれなケースの1つは、引数としてarrayを渡すことです。

どのくらいのサイズになる可能性があるのか​​わからないときにコレクションを定義したい場合は、arrayを選択するのではなく、List<T>などのようなものにします。

とはいえ、sizeを指定せずに配列を宣言する唯一の方法は、 size 0 の空の配列を持つことです。hemant および Alex Dn には2つの方法があります。もう1つの簡単な方法は :だけです。

string[] a = { };

[角カッコ内の要素は、暗黙的に定義済みの型に変換可能である必要があります。たとえば、string[] a = { "a", "b" };]

またはそれ以外の場合:

var a = Enumerable.Empty<string>().ToArray();

これはもっと宣言的な方法です

public static class Array<T>
{
    public static T[] Empty()
    {
        return Empty(0);
    }

    public static T[] Empty(int size)
    {
        return new T[size];
    }
}

今、あなたは呼び出すことができます:

var a = Array<string>.Empty();

//or

var a = Array<string>.Empty(5);
6
nawfal

できるよ:

string[] a = { String.Empty };

注:OPは、サイズを指定する必要がないこと、配列を作成しないことを意味します sizeless

3
vapcguy

シンプルでエレガント!

string[] array = {}
2
disklosr

実行時に配列サイズを定義できます

これにより、配列のサイズを動的に計算するために何でもできるようになります。しかし、一度定義されたサイズは不変です。

Array a = Array.CreateInstance(typeof(string), 5);
2
radarbob

私が試してみました:

string[] sample = new string[0];

しかし、それに1つの文字列しか挿入できず、それからexceptionOutOfBoundエラーが発生したので、単純にサイズを設定します。

string[] sample = new string[100];

または私のために働くもう一つの方法:

List<string> sample = new List<string>();

リストに値を割り当てる:

sample.Add(your input);
2
Cs_Lu

私はあなたがサイズなしで配列を作ることはできません知っているように、あなたは使用することができます

List<string> l = new List<string>() 

そしてl.ToArray()

1
Alex Dn

@nawfalと@Kobiの提案を組み合わせる:

namespace Extensions
{
    /// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
    public static class Array<T>
    {
        public static readonly T[] Empty = new T[0];
    }
}

使用例

Array<string>.Empty

UPDATE 2019-05-14

(@Jaider tyのクレジット)

より良い使用。NetAPI:

public static T[] Empty<T> ();

https://docs.Microsoft.com/ja-jp/dotnet/api/system.array.empty?view=netframework-4.8

に適用されます:

.NET Core:3.0プレビュー5 2.2 2.1 2.0 1.1 1.0

.NET Framework:4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6

.NET標準:2.1プレビュー2.0 1.6 1.5 1.4 1.4 1.3

...

HTH

0
ShloEmi

これが現実の例です。この場合、配列foundFilesを最初に長さ0に初期化する必要があります。

(他の答えで強調されるように:これは配列が長さ1を持つことを意味するので、これは要素ではなく、特にインデックスゼロの要素では初期化しません!).

= string[0]の部分を省略すると、コンパイラエラーが発生します。

これは、再スローのないcatchブロックのためです。 C#コンパイラはコードパスを認識します。つまり、関数Directory.GetFiles()はExceptionをスローし、その結果、配列が初期化されない可能性があります。

誰かが言う前に、例外を再スローしないことは悪いエラー処理になるでしょう:これは本当ではありません。エラー処理は要件を満たす必要があります。

この場合、読めない、壊れていないディレクトリの場合でもプログラムは続行する必要があります。最良の例はディレクトリ構造を通過する関数です。ここでのエラー処理は単にログに記録することです。もちろんこれはもっと良くできます。失敗したGetFiles(Dir)呼び出しを含むすべてのディレクトリをリストにまとめますが、これはここでは遠すぎます。

throwを回避することは有効なシナリオであると述べれば十分であるため、配列は長さゼロに初期化する必要があります。 catchブロックでこれを実行すれば十分ですが、これは悪いスタイルです。

GetFiles(Dir)の呼び出しは配列のサイズを変更します。

string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
    foundFiles = Directory.GetFiles(dir);  // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
  Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
  // throw; // This would throw Exception to caller and avoid compiler error
}

foreach (string filename in foundFiles)
    Console.WriteLine("Filename: " + filename);
0
Philm