1. ホーム
  2. c#

[解決済み] C#の配列に「プッシュ」する最適な方法

2022-01-28 22:31:02

質問

こんにちは

これはかなり広く議論されている問題であることは分かっていますが、決定的な答えが見つからないようです。リストを使って私が求めていることができるのは知っていますが、それでは私の問題を解決できません。

私は初級C#のクラスを教えています。私はPHPとJava Scriptのバックグラウンドがあるため、これらの言語の観点から考える傾向があります。

リストを使用することはできません。なぜなら、これらは現在私が教えているシラバスの一部ではないからです(学期の後半には出てきますが)。

したがって、私は、初心者コーダーに悪い習慣を教えることなく理解できる、Java array.push(newValue)タイプのシナリオを実行する最も簡単な方法を探しています。

これまで、私がどのようにこの問題に取り組んできたかを紹介します。

for (int i = 0; i < myArray.Length; i++)
{
   if(myArray[i] == null)
   {
       myArray[i] = newValue;
       break;
   }
}

私はただ、これが受け入れられるアプローチなのか、私が彼らに悪い習慣を教えているのか、あるいは私の目標を達成するためのより良い/より簡単な方法があるのかを知る必要があります。

EDIT 問題の核心は、要素を配列の最初の空のスロットに追加する必要があるということで、Javaのpush関数がそうなるように。

何かアドバイスがあれば、ぜひお願いします。

解決方法は?

array.push というのは List<T>.Add . .NETの配列はサイズが固定されているので、実際に新しい要素を追加することはできません。 できることは、元の配列より1要素大きい新しい配列を作成し、その最後の要素を設定することだけです、例えば。

Array.Resize(ref myArray, myArray.Length + 1);
myArray[myArray.GetUpperBound(0)] = newValue;

EDIT

この質問に対する編集を考えると、この回答が実際に適用されるかどうかわからないのですが。

この問題の核心は、要素を 配列の最初の空いたスロットは、Javaのプッシュ関数がそうです。

私が提供したコードは、効果的に要素を追加します。 もし、最初の空の要素を設定することが目的なら、このようにすることができます。

int index = Array.IndexOf(myArray, null);

if (index != -1)
{
    myArray[index] = newValue;
}

EDIT

このロジックをカプセル化し、値が配置されたインデックス、または空の要素がない場合は -1 を返す拡張メソッドを紹介します。 このメソッドは値の型に対しても機能し、その型のデフォルト値を持つ要素を空として扱うことに注意してください。

public static class ArrayExtensions
{
    public static int Push<T>(this T[] source, T value)
    {
        var index = Array.IndexOf(source, default(T));

        if (index != -1)
        {
            source[index] = value;
        }

        return index;
    }
}