サイズを指定せずに空の配列を作成することは可能ですか?
たとえば、私は作成しました:
String[] a = new String[5];
上記の文字列配列をサイズなしで作成できますか?
事前にサイズがわからないコレクションを使用する場合は、配列よりも優れたオプションがあります。
代わりにList<string>
を使用します-必要な数の項目を追加でき、配列を返す必要がある場合は、変数でToArray()
を呼び出します。
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
must空の配列を作成する場合、これを行うことができます:
string[] emptyStringArray = new string[0];
これを試して:
string[] a= new string[] { };
.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];
}
(コード契約に関連するコードは明確にするために削除されています)
また見なさい:
Array.Empty
ソースコードArray.Empty<T>()
の紹介サイズを0にして初期化することもできますが、配列に追加できないため、サイズが何であるかがわかっている場合は再初期化する必要があります。
string[] a = new string[0];
サイズなしで配列を宣言しても意味がありません。配列サイズに近い特定のサイズの配列を宣言するときは、物を保持できるコレクション内で使用可能な固定数のスロットを指定します。したがって、メモリが割り当てられます。何かを追加するには、とにかく既存の配列を再初期化する必要があります(配列のサイズを変更している場合でも、 このスレッドを参照してください )。空の配列を初期化したいというまれなケースの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);
できるよ:
string[] a = { String.Empty };
注:OPは、サイズを指定する必要がないこと、配列を作成しないことを意味します sizeless
シンプルでエレガント!
string[] array = {}
実行時に配列サイズを定義できます 。
これにより、配列のサイズを動的に計算するために何でもできるようになります。しかし、一度定義されたサイズは不変です。
Array a = Array.CreateInstance(typeof(string), 5);
私が試してみました:
string[] sample = new string[0];
しかし、それに1つの文字列しか挿入できず、それからexceptionOutOfBoundエラーが発生したので、単純にサイズを設定します。
string[] sample = new string[100];
または私のために働くもう一つの方法:
List<string> sample = new List<string>();
リストに値を割り当てる:
sample.Add(your input);
私はあなたがサイズなしで配列を作ることはできません知っているように、あなたは使用することができます
List<string> l = new List<string>()
そしてl.ToArray()
。
@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
これが現実の例です。この場合、配列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);