11

私は次のような文字列配列を持っています:

 string [] items = {"one","two","three","one","two","one"};

一度にすべてゼロに置き換えたいのですが。次に、アイテムは次のようになります。

{"zero","two","three","zero","two","zero"};

1つの解決策を見つけました文字列配列の項目を置き換えるにはどうすればよいですか?

ただし、最初の出現のみを置き換えます。すべての発生を置き換えるための最良の方法/アプローチはどれですか?

4

8 に答える 8

40

ループせずにそれを行う方法はありません..次のようなものでも内部的にループします:

string [] items = {"one","two","three","one","two","one"};

string[] items2 = items.Select(x => x.Replace("one", "zero")).ToArray();

ループできないという要件がある理由がわかりません..ただし、常にループする必要があります。

于 2012-08-03T05:30:33.957 に答える
14

各要素をループせずに置き換える方法が 1 つあります。

 string [] items = {"zero","two","three","zero","two","zero"};

それ以外は、配列を反復処理する必要があります (for/lambda/foreach)

于 2012-08-03T05:47:06.823 に答える
10

申し訳ありませんが、ループする必要があります。それを回避することはできません。

また、他のすべての回答は、目的の要素を含む新しい配列を提供します。質問が示唆するように、同じ配列の要素を変更したい場合は、このようにする必要があります。

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;
    }
}
于 2012-08-03T06:24:00.697 に答える
3
string [] items = {"one","two","three","one","two","one"};
items =  items.Select(s => s!= "one" ? s : "zero").ToArray();

ここから答えが見つかりました。

于 2012-08-03T06:55:38.363 に答える
3

並行して行うこともできます。

Parallel.For(0, items.Length,
  idx => { if(items[idx] == "one") { item[idx] = "zero"; } });
于 2012-08-03T07:24:04.470 に答える
2

これを試すことはできますが、ループも行うと思います。

string [] items = {"one","two","three","one","two","one"};
var str= string.Join(",", items);
var newArray = str.Replace("one","zero").Split(new char[]{','});
于 2012-08-03T05:36:07.997 に答える
1
string[] items = { "one", "two", "three", "one", "two", "one" };

指定したインデックスの方法が必要な場合:

int n=0;
while (true)
{
n = Array.IndexOf(items, "one", n);
if (n == -1) break;
items[n] = "zero";
}

しかし、LINQの方が良いでしょう

var lst = from item in items
select item == "one" ? "zero" : item;
于 2012-08-03T05:39:45.947 に答える
0
string[] newarry = items.Select(str => { if (str.Equals("one")) str = "zero"; return str; }).ToArray();
于 2012-08-03T05:35:49.083 に答える