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);
}

답변:


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

예외 발생-LINQ to Entities가 'Int32 IndexOf (Char)'메소드를 인식하지 못하므로이 메소드를 상점 표현식으로 변환 할 수 없습니다. .net 4.0
markthewizard1234

4
@ markthewizard1234 귀하 listofIDsIQueryable<string>실행되지 않은 경우에 발생합니다 . ToList()변환 을 하기 전에 먼저 실행하십시오 :listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck

2013 년에는 이것이 효과가 있었지만 더 이상 효과가 없었습니다. linq 문을 사용하여 아래에 새로운 옵션을 추가했습니다.
Brandon Turpy

1
문자열이 실제로 정수가 아닌 경우 예외가 발생합니다. 아래 안전 버전을 참조하십시오. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck 첫 번째 ToList는 AsEnumerable에게, 두 번째 목록 할당 할 필요 없을 것
로난 Thibaudau

38

Linq 사용 ...

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

20

다음은 유효하지 않은 정수를 필터링 하는 안전한 변형입니다.

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에 대해 항목이 삽입 되는 nullable int 목록을 반환합니다 (즉, 원래 목록 수를 유지함).

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


13

Linq 사용하기 :

var intList = stringList.Select(s => Convert.ToInt32(s)).ToList()

1
var intList = stringList.Select (Convert.ToInt32) .ToList ()
shivani

12

TryParse는 무엇입니까? 유효하지 않은 정수를 필터링하는 안전한 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에게 감사드립니다.


3

나는 그것이 오래된 게시물이라는 것을 알고 있지만 이것이 좋은 추가라고 생각했습니다. List<T>.ConvertAll<TOutput>

List<int> integers = strings.ConvertAll(s => Int32.Parse(s));

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);오류가 사이의 모호한 호출입니다 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에는 매우 낭비적인 것처럼 보이므로 값을 제공 한 다음 해당 값을 창 밖으로 던져 파싱을 수행하십시오. 본질적으로 이중 파싱입니다.
Ristogod


0

이 간단한 문제로 인해 과잉이 될 수 있습니다. 그러나 Linq와 관련된 Try-Do 메서드의 경우 좀 더 표현적인 코드에 익명 클래스를 사용하는 경향이 있습니다. Olivier Jacot-DescombesBA 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
코드 만 제공하는 대신 답변에 대한 텍스트 설명을 추가해보십시오.
carlosfigueira

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

안녕 Patryk. StackOverflow에 오신 것을 환영합니다. 게시 한 예쁜 간결한 솔루션에 대해 조금 더 설명을 작성하면 더 좋습니다. 이것은이 웹 사이트의 아주 오래된 질문에 대한 답변이며 여러 사용자가 검토 할 것입니다.
Aditya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.