web-dev-qa-db-ja.com

コンマ区切りの文字列をList <int>に変換するにはどうすればよいですか

string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',');

Splitメソッドがstring []を返すため、これは機能しません。

助けてください。

174
ignaciofuentes

これを行う1つの方法は次のとおりです。

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
382
dasblinkenlight

単純な検証を含めて(例外をスローする代わりに)無効な値をスキップしたい場合は、TryParseを使用します。

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

EDIT: Antoineによるフィードバックに基づいて更新されたクエリです。最初にTryParseを呼び出して不適切な値を除外し、次にParseを実行して実際の変換を行います。

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5
19
khalid13

LINQ w/int.Parse()を使ってstring[]IEnumerable<int>に変換し、その結果をList<T>コンストラクタに渡すことができます。

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));
14
Justin Niessner

少しLINQは大いに役立ちます:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();
7
Henk Holterman

LINQ Queryがなければ、この方法を選ぶことができます。

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

そして、このリストを整数型に変換することができます。

6
user4860969
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList();
4
Oybek

C#3.5を使用している場合は、これを達成するためにLinqを使用できます。

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

または短いもの

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();
2
Agustin Meriles
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
2
LiquidPony

私はこれにつまずきました、そして私はただlinqなしで私自身の解決策を共有したいと思います。これは原始的なアプローチです。整数以外の値もリストに追加されません。

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

お役に立てれば。

1
drchanix

私はkhalid13の答えを修正しました。ユーザーが "0"の文字列を入力した場合、彼の答えは結果のリストからそれを削除します。私は似たようなことをしましたが、無名オブジェクトを使いました。

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtectionは私が作ったカスタム関数で、文字列がnullかどうかを保護します。

上記がすることは、エラーなしで変換することができなかったすべての文字列を取り除くことです。変換に問題がある場合にエラーが発生する必要がある場合は、承認された回答が有効です。

1
SolidSnake4444

それは簡単です。最初に文字列を分割します。コンマ(、)の後に存在する空白スペースを削除します。次に、システム定義のToList()を使用します

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

「、」の後のスペースを削除し、このコンマ区切りテキストをリストに変換するには

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
0
Parag555