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


回答:


433

これを行う1つの方法を次に示します。

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

11
それも可能性がありますList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog

2
の必要性はありnew List<>ますか?
LiquidPony

2
@LiquidPony no; ToList()代わりに呼び出すことができます。結果は基本的に同じです。List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); ただし、の戻り値はSelect()であるので、どちらかを行う必要IEnumerable<>がありますList<>
phoog

この実装の@LiquidPonyはSelect、この場合の拡張機能が返されIEnumerable<Int32>、リストにないため、はい。ただし、リストには、別のコレクションをソースとして受け入れるコンストラクターがあります。
オイベク

8
タグが空の文字列である場合を処理するには、Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

25

(例外をスローするのではなく)いくつかの単純な検証を含めて無効な値をスキップする場合は、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

編集: 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

編集2: Charles Burnsからのフィードバックのおかげで、C#7.0の更新されたクエリ。この方法で余分なmos変数を取り除くので、少しクリーンになります。

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

1
0が正当な入力の1つである場合は失敗します。
アントワーヌメルツハイム2018年

2
C#7.0では、mosの宣言を省略して、TryParse呼び出しを次のように置き換えることができますint.TryParse(m, out int _)
Charles Burns

14

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

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


6

LINQクエリがなくても、この方法を選択できます。

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

次に、このリストを整数型に変換できます...


知らない人への単なるメモ= .ToList<string>()まだ必要using System.Linq;
ビル・ローリンソン


2

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
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

1

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

私はこれに偶然出会い、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);
    }
}

お役に立てれば。


-2

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

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

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

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.