web-dev-qa-db-ja.com

リスト内の文字列値を置き換える

「goalXXvalue、goalXXLength、TestXX」のような値を含む文字列のコレクションがあります。これは(文字列の)リストです。各項目をループして、以下の方法で試したXX値を置き換えることができると思いましたが、値は変更されません。どこがいけないの?ありがとう

metricList.ForEach(Function(n) n.Replace("XX", "1"))

18
mjroodt

ここにいくつかの問題があります:

  • まず、文字列は不変であるため、.Replaceを呼び出すと、新しい文字列が返されます。 n.Replaceを呼び出しても、nは変更されません。
  • 無名関数でnに割り当てても、リストの値には影響しません。
  • 上記に関係なく、列挙を無効にするため、列挙中にコレクションのコンテンツを変更することはできません。

リスト内のすべての文字列を変更しているようなので、コレクションをインプレースで変更する必要はありません。したがって、簡潔な解決策は、Linqを使用して新しいリストを作成することです。

var newList = metricList.Select(s => s.Replace("XX", "1")).ToList();
31
Dan Puzey

問題:置換された文字列で何もしていません。
これは、単純なループを使用して簡単に実行できます。

C#

for(int i = 0; i < metricList.Count; i++)
{
    metricList[i] = metricList[i].Replace("XX", "1");
}

VB.NET

For i As Integer = 0 To metricList.Count - 1
    metricList(i) = metricList(i).Replace("XX", "1")
Next

コードはmetricList内のすべての文字列を反復処理し、XX1に置き換えます。次に、値をリストの正しい場所に戻します。これは、コードで行っていないことです。 ...

またはLinqを使用する:

C#

var newList = metricList.Select(x => x.Replace("XX", "1")).ToList();

VB.NET

Dim newList = metricList.Select(Function(x) x.Replace("XX", "1")).ToList()

クラスの先頭にlinqへの参照を追加することを忘れないでください:

C#

using System.Linq;

VB.NET

Imports System.Linq
7
Max

String.Replaceメソッドの結果を割り当てる必要があります。したがって、あなたのfuncは何かを返すか、foreach selectの代わりに使用する必要があります

0
Regfor