我有一个字符串数组,如:
string [] items = {"one","two","three","one","two","one"};
我想立即将所有的零替换为零。 项目应该是:
{"zero","two","three","zero","two","zero"};
我找到了一个解决方案How do I replace an item in a string array?。
但它只会取代第一次出现。哪种方法/方法可以替换所有事件?
答案 0 :(得分:31)
如果没有循环,没有办法做到这一点..即使是这样的内部循环:
string [] items = {"one","two","three","one","two","one"};
string[] items2 = items.Select(x => x.Replace("one", "zero")).ToArray();
我不确定为什么你的要求是你不能循环..但是,它总是需要循环。
答案 1 :(得分:14)
有一种方法可以在不循环遍历每个元素的情况下替换它:
string [] items = {"zero","two","three","zero","two","zero"};
除此之外,你必须遍历数组(对于/ lambda / foreach)
答案 2 :(得分:9)
抱歉,你必须循环。没有解决它。
此外,所有其他答案都会为您提供带有所需元素的新数组。如果您希望相同的数组修改其元素,正如您的问题所暗示的那样,您应该这样做。
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;
}
}
答案 3 :(得分:3)
string [] items = {"one","two","three","one","two","one"};
items = items.Select(s => s!= "one" ? s : "zero").ToArray();
从here找到答案。
答案 4 :(得分:3)
您也可以并行执行:
Parallel.For(0, items.Length,
idx => { if(items[idx] == "one") { item[idx] = "zero"; } });
答案 5 :(得分:1)
你可以尝试这个,但我想,它也会循环。
string [] items = {"one","two","three","one","two","one"};
var str= string.Join(",", items);
var newArray = str.Replace("one","zero").Split(new char[]{','});
答案 6 :(得分: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;
答案 7 :(得分:0)
string[] newarry = items.Select(str => { if (str.Equals("one")) str = "zero"; return str; }).ToArray();