動的にC#で配列の長さを設定する方法
-
22-08-2019 - |
質問
私はまだC#に新しいですし、私は、アレイ上の様々な問題に苦しんできました。私は、メタデータオブジェクト(名前と値のペア)の配列を持っていると私は本当に必要な「InputProperty」オブジェクトの数だけを作成する方法を知っていただきたいと思います。このループでは、私は20に要素の数を任意に設定していると私は、エントリがnullになったときに救済しようとするが、これの受信側のWebサービスがそれに渡された任意のnull要素が好きではありません。
private Update BuildMetaData(MetaData[] nvPairs)
{
Update update = new Update();
InputProperty[] ip = new InputProperty[20]; // how to make this "dynamic"
int i;
for (i = 0; i < nvPairs.Length; i++)
{
if (nvPairs[i] == null) break;
ip[i] = new InputProperty();
ip[i].Name = "udf:" + nvPairs[i].Name;
ip[i].Val = nvPairs[i].Value;
}
update.Items = ip;
return update;
}
要約すると、私は上記の入力配列で3のNameValueのペアを持っていると言いますか?配列と呼ばれるIPのための20個の要素を割り当てるのではなく、どのようにする必要がありますように、このようにIPが唯一のように大きいコーディングすることができます。シリアライゼーション(すなわちIはNameValueCollectionの、などを使用することができない)ことが重要であるので、更新オブジェクトが別のウェブサービスを介して渡されます。
p.s。 「コメントを追加」機能によって掲示質問にフォローアップするための唯一の方法ですか?
解決
List
、ArrayList
、または他の動的サイズのコレクションを使用して、(それは私が道で、お勧めの方法です)配列に変換したくない場合は、、あなたは割り当てする必要があります可能な最大サイズの配列、その中だけでこれらのアイテムを使用して新しい配列を作成し、その後、あなたがそれに入れどのように多くのアイテムを追跡し、かつます:
private Update BuildMetaData(MetaData[] nvPairs)
{
Update update = new Update();
InputProperty[] ip = new InputProperty[20]; // how to make this "dynamic"
int i;
for (i = 0; i < nvPairs.Length; i++)
{
if (nvPairs[i] == null) break;
ip[i] = new InputProperty();
ip[i].Name = "udf:" + nvPairs[i].Name;
ip[i].Val = nvPairs[i].Value;
}
if (i < nvPairs.Length)
{
// Create new, smaller, array to hold the items we processed.
update.Items = new InputProperty[i];
Array.Copy(ip, update.Items, i);
}
else
{
update.Items = ip;
}
return update;
}
別の方法は、常にupdate.Items = ip;
を割り当て、必要に応じてサイズを変更することであろう。
update.Items = ip;
if (i < nvPairs.Length)
{
Array.Resize(update.Items, i);
}
これは、以下のコードだが、可能性の高い(すなわち、新しい配列を作成し、古いアイテムをコピーする)作業の同じ量をしていることになります。
他のヒント
InputProperty[] ip = new InputProperty[nvPairs.Length];
それとも、あなたはそうのようなリストを使用することができます:
List<InputProperty> list = new List<InputProperty>();
InputProperty ip = new (..);
list.Add(ip);
update.items = list.ToArray();
私が指摘したいと思います。もう一つは、C#で使用すると、右のループの内側ループの中にあなたのint型の変数の使用をdelcareすることができます:
for(int i = 0; i<nvPairs.Length;i++
{
.
.
}
そして、私は気分でちょうどので、ここではIMOこの方法を行うためのクリーンな方法があります:
private Update BuildMetaData(MetaData[] nvPairs)
{
Update update = new Update();
var ip = new List<InputProperty>();
foreach(var nvPair in nvPairs)
{
if (nvPair == null) break;
var inputProp = new InputProperty
{
Name = "udf:" + nvPair.Name,
Val = nvPair.Value
};
ip.Add(inputProp);
}
update.Items = ip.ToArray();
return update;
}
配列する必要がされていますか?あなたはArrayListのか、C#で利用可能な他のオブジェクトのいずれかを使用する場合は、あなたがコンテンツへこの制限はありません。ハッシュテーブル、IDictionnary、IListの、など。全ての要素の動的な数を可能にする。
これを使用します:
Array.Resize(ref myArr, myArr.Length + 5);
あなたは、メソッドの内部リストを使用して、最後に配列に変換できます。しかし、私たちは20の最大値について話す場合、あなたのコードが高速だと思います。
private Update BuildMetaData(MetaData[] nvPairs)
{
Update update = new Update();
List<InputProperty> ip = new List<InputProperty>();
for (int i = 0; i < nvPairs.Length; i++)
{
if (nvPairs[i] == null) break;
ip[i] = new InputProperty();
ip[i].Name = "udf:" + nvPairs[i].Name;
ip[i].Val = nvPairs[i].Value;
}
update.Items = ip.ToArray();
return update;
}
それとも、中間リストをスキップすることができSystem.Linq
を使用してC#3.0でます:
private Update BuildMetaData(MetaData[] nvPairs)
{
Update update = new Update();
var ip = from nv in nvPairs
select new InputProperty()
{
Name = "udf:" + nv.Name,
Val = nv.Value
};
update.Items = ip.ToArray();
return update;
}
動的配列を作成するArray.CreateInstance
を使用します。
private Update BuildMetaData(MetaData[] nvPairs)
{
Update update = new Update();
InputProperty[] ip = Array.CreateInstance(typeof(InputProperty), nvPairs.Count()) as InputProperty[];
int i;
for (i = 0; i < nvPairs.Length; i++)
{
if (nvPairs[i] == null) break;
ip[i] = new InputProperty();
ip[i].Name = "udf:" + nvPairs[i].Name;
ip[i].Val = nvPairs[i].Value;
}
update.Items = ip;
return update;
}
一般的に、アレイは、それらのサイズを初期化するための定数を必要とします。その後、「動的」のように長さのために変数を使用してアレイを作成し、長さを取得するために、一度nvPairs上で掃引可能性があります。
InputProperty[] ip = (InputProperty[])Array.CreateInstance(typeof(InputProperty), length);
でも、私はそれをお勧めしません。ただ、
にこだわりますList<InputProperty> ip = ...
...
update.Items = ip.ToArray();
ソリューション。それははるかに少ないパフォーマンスではない、とずっといい探します。
あなたは、このように動的に配列を作成することができます:
static void Main()
{
// Create a string array 2 elements in length:
int arrayLength = 2;
Array dynamicArray = Array.CreateInstance(typeof(int), arrayLength);
dynamicArray.SetValue(234, 0); // → a[0] = 234;
dynamicArray.SetValue(444, 1); // → a[1] = 444;
int number = (int)dynamicArray.GetValue(0); // → number = a[0];
int[] cSharpArray = (int[])dynamicArray;
int s2 = cSharpArray[0];
}