List <string>をList <int>に変換する方法は?


157

私の質問はこの問題の一部です:

フォームからIDのコレクションを受け取ります。キーを取得して整数に変換し、DBから一致するレコードを選択する必要があります。

[HttpPost]
public ActionResult Report(FormCollection collection)
{
    var listofIDs = collection.AllKeys.ToList();  
    // List<string> to List<int>
    List<Dinner> dinners = new List<Dinner>();
    dinners= repository.GetDinners(listofIDs);
    return View(dinners);
}

回答:


390
listofIDs.Select(int.Parse).ToList()

例外が発生-LINQ to Entitiesはメソッド 'Int32 IndexOf(Char)'メソッドを認識せず、このメソッドはストア式に変換できません。.net 4.0
markthewizard1234 2016年

4
@ markthewizard1234これlistofIDsは、IQueryable<string>実行されていないものである場合に発生します。最初にそれを実行しToList()ますが、変換を行う前に、:listofIDs.ToList().Select(int.Parse).ToList()
マイケルHornfeck

確かに2013年にはこれでうまくいきましたが、これはもはや私にはうまくいきませんでした。linqステートメントを使用して、以下の新しいオプションを追加しました。
ブランドンターピー2018

1
これは、文字列のいずれかが実際にintでない場合に例外をスローします。以下の安全なバージョンをご覧ください。stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck最初のToListはAsEnumerableでなければならず、2番目のリストを割り当てる必要はありません
Ronan Thibaudau

38

Linqの使用...

List<string> listofIDs = collection.AllKeys.ToList();  
List<int> myStringList = listofIDs.Select(s => int.Parse(s)).ToList();

20

次に、無効なintを除外する安全なバリアントを示します。

List<int> ints = strings
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
    .Where(n => n.HasValue)
    .Select(n => n.Value)
    .ToList();

outC#7.0で導入された新しい変数を使用します。

この他のバリアントは、null無効なintに対してエントリが挿入されるnull許容intのリストを返します(つまり、元のリストカウントを保持します)。

List<int?> nullableInts = strings
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
    .ToList();

まことにありがとうございます!stackoverflow.com/a/48712010/2340825
BA TabNabber


12

TryParseとは何ですか? 無効なintを除外する安全なLINQバージョン(C#6.0以下の場合):

List<int>  ints = strings
    .Select(s => { int i; return int.TryParse(s, out i) ? i : (int?)null; })
    .Where(i => i.HasValue)
    .Select(i => i.Value)
    .ToList();

アイデアとC#7.0バージョンのOlivier Jacot-Descombesの功績によるものです。



1

これが最も簡単な方法だと思います:

var listOfStrings = (new [] { "4", "5", "6" }).ToList();
var listOfInts = listOfStrings.Select<string, int>(q => Convert.ToInt32(q));

6
私はラムダ式でこの種のパターンをよく見ます:x => someMethod(x)。おそらく、これをsomeMethodに置き換える必要があります。これで、例はlistOfStrings.Select <string、int>(Convert.ToInt32);になります。。それはおそらくより読みやすく、より速く、より短く、すでによりエレガントに言及しましたか?この質問に答える他のすべての人にも同じことが言えます。
JBSnorro

矢印の構文を省略するとエラーが発生します。これは機能しますList<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));が、これは機能しません。IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);エラーは、Selectのバージョンstring,int,intstring,intバージョンの間のあいまいな呼び出しです。
goodeye

1

文字列値を整数リストに変換します

var myString = "010"; 
int myInt;
List<int> B = myString.ToCharArray().Where(x => int.TryParse(x.ToString(), out myInt)).Select(x => int.Parse(x.ToString())).ToList();

0

これを実現する別の方法は、linqステートメントを使用することです。.NetCore2.0では、推奨される回答が機能しませんでした。しかし、私はそれを理解することができました、そして、あなたがより新しい技術を使っているなら、以下もうまくいくでしょう。

[HttpPost]
public ActionResult Report(FormCollection collection)
{
    var listofIDs = collection.ToList().Select(x => x.ToString());
    List<Dinner> dinners = new List<Dinner>();
    dinners = repository.GetDinners(listofIDs);
    return View(dinners);
}

0

LINQ経由で使用できます

     var selectedEditionIds = input.SelectedEditionIds.Split(",").ToArray()
                            .Where(i => !string.IsNullOrWhiteSpace(i) 
                             && int.TryParse(i,out int validNumber))
                            .Select(x=>int.Parse(x)).ToList();

TryParseはかなり無駄が多いようです。これは値を提供し、その値をウィンドウの外に投げてParseを実行するだけです。あなたは本質的に二重の構文解析をしています。
リストゴッド


0

これは、この単純な問題にとってはやり過ぎかもしれません。しかし、Linqに関連するTry-Doメソッドでは、より表現力のあるコードのために匿名クラスを使用する傾向があります。これは、Olivier Jacot -DescombesおよびBA TabNabberからの回答に似ています。

List<int> ints = strings
    .Select(idString => new { ParseSuccessful = Int32.TryParse(idString, out var id), Value = id })
    .Where(id => id.ParseSuccessful)
    .Select(id => id.Value)
    .ToList();

-1
  public List<int> ConvertStringListToIntList(List<string> list) 
  {
     List<int> resultList = new List<int>();
     for (int i = 0; i < list.Count; i++)
        resultList.Add(Convert.ToInt32(list[i]));

     return resultList;
  }

3
コードのみを提供するのではなく、回答についてテキストによる説明を追加することを検討してください。
カルロスフィゲイラ2014

-1
yourEnumList.Select(s => (int)s).ToList()

こんにちはパトリク。StackOverflowへようこそ。あなたが投稿したかなり簡潔な解決策についてもう少し説明を書くことができればもっと良いでしょう。これは、このWebサイトの非常に古い質問に対する回答であり、複数のユーザーによってレビューされます。
Aditya 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.