申し訳ありませんが、ループする必要があります。それを回避することはできません。
また、他のすべての回答は、目的の要素を含む新しい配列を提供します。質問が示唆するように、同じ配列の要素を変更したい場合は、このようにする必要があります。
for (int index = 0; index < items.Length; index++)
if (items[index] == "one")
items[index] = "zero";
単純。
これが必要になるたびにコードにループを記述しないようにするには、メソッドを作成します。
void ReplaceAll(string[] items, string oldValue, string newValue)
{
for (int index = 0; index < items.Length; index++)
if (items[index] == oldValue)
items[index] = newValue;
}
次に、次のように呼び出します。
ReplaceAll(items, "one", "zero");
拡張メソッドにすることもできます。
static class ArrayExtensions
{
public static void ReplaceAll(this string[] items, string oldValue, string newValue)
{
for (int index = 0; index < items.Length; index++)
if (items[index] == oldValue)
items[index] = newValue;
}
}
次に、次のように呼び出すことができます。
items.ReplaceAll("one", "zero");
あなたがそれに取り組んでいる間、あなたはそれを一般的にしたいかもしれません:
static class ArrayExtensions
{
public static void ReplaceAll<T>(this T[] items, T oldValue, T newValue)
{
for (int index = 0; index < items.Length; index++)
if (items[index].Equals(oldValue))
items[index] = newValue;
}
}
呼び出しサイトは同じように見えます。
現在、これらのアプローチはいずれも、カスタム文字列等価チェックをサポートしていません。たとえば、比較で大文字と小文字を区別するかどうかを指定できます。を受け取るオーバーロードを追加して、IEqualityComparer<T>
好きな比較を提供できるようにします。T
これは、そうであろうとなかろうと、はるかに柔軟string
です。
static class ArrayExtensions
{
public static void ReplaceAll<T>(this T[] items, T oldValue, T newValue)
{
items.ReplaceAll(oldValue, newValue, EqualityComparer<T>.Default);
}
public static void ReplaceAll<T>(this T[] items, T oldValue, T newValue, IEqualityComparer<T> comparer)
{
for (int index = 0; index < items.Length; index++)
if (comparer.Equals(items[index], oldValue))
items[index] = newValue;
}
}