11

我有一个字符串数组,如:

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

我想一次用零替换所有的。那么项目应该是:

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

我找到了一个解决方案如何替换字符串数组中的项目?.

但它只会替换第一次出现。哪个是替换所有事件的最佳方法/方法?

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

有一种方法可以在不遍历每个元素的情况下替换它:

 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>,这样您就可以提供您喜欢的比较;这更加灵活,无论Tstring还是其他:

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 回答