Làm cách nào để chuyển đổi Danh sách <chuỗi> thành Danh sách <int>?


157

Câu hỏi của tôi là một phần của vấn đề này:

Tôi nhận được một bộ sưu tập id từ một hình thức. Tôi cần lấy các khóa, chuyển đổi chúng thành số nguyên và chọn các bản ghi khớp từ 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);
}

Câu trả lời:


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

Ngoại lệ được nêu ra - LINQ to Entities không nhận ra phương thức 'Int32 IndexOf (Char)' và phương thức này không thể được dịch thành biểu thức lưu trữ. .net 4.0
markthewizard1234

4
@ markthewizard1234 Điều đó sẽ xảy ra nếu bạn listofIDslà một IQueryable<string>mà chưa được thực thi. Thực hiện trước tiên ToList()trước khi bạn thực hiện chuyển đổi:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck

Tôi chắc chắn trong năm 2013 này đã làm việc, nhưng điều này không còn làm việc cho tôi. Đã thêm một tùy chọn mới hơn bên dưới bằng cách sử dụng câu lệnh linq.
Brandon Turpy

1
Điều này sẽ đưa ra một ngoại lệ nếu bất kỳ chuỗi nào không thực sự là số nguyên. Xem các phiên bản an toàn dưới đây. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck ToList đầu tiên phải là AsEnumerable, không cần phân bổ Danh sách thứ hai
Ronan Thibaudau

38

Sử dụng Linq ...

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

20

Đây là một biến thể an toàn giúp lọc các int không hợp lệ:

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

Nó sử dụng các outbiến mới được giới thiệu với C # 7.0.

Biến thể khác này trả về một danh sách các ints nullable trong đó nullcác mục nhập được chèn cho các int không hợp lệ (nghĩa là nó giữ nguyên số lượng danh sách ban đầu):

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

Cảm ơn rất nhiều! Phiên bản cho C # 6.0 bên dưới stackoverflow.com/a/48712010/2340825
BA TabNabber

13

Sử dụng Linq:

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

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

12

Những gì không có TryPude? Phiên bản LINQ an toàn lọc các int không hợp lệ (cho C # 6.0 trở xuống):

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

tín dụng cho Olivier Jacot-Descombes cho ý tưởng và phiên bản C # 7.0.


3

Tôi biết đó là bài viết cũ, nhưng tôi nghĩ đây là một bổ sung tốt: Bạn có thể sử dụng List<T>.ConvertAll<TOutput>

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

1

Đây là cách đơn giản nhất, tôi nghĩ:

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

6
Tôi thấy loại mô hình này trong các biểu thức lambda thường: x => someMethod (x) . Bạn có biết bạn có lẽ nên thay thế nó bằng someMethod . Với ví dụ đó, ví dụ của bạn trở thành listOfStrings.Select <string, int> (Convert.ToInt32); . Điều đó có lẽ dễ đọc hơn, nhanh hơn, ngắn hơn và tôi đã đề cập đến thanh lịch hơn chưa? Tất cả những người khác trả lời câu hỏi này cũng vậy.
JBSnorro

Tôi đang gặp lỗi khi bỏ qua cú pháp mũi tên. Điều này hoạt động: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));nhưng điều này không: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);Lỗi là cuộc gọi mơ hồ giữa string,int,intstring,intcác phiên bản của Chọn.
tạm biệt

1

Chuyển đổi giá trị chuỗi thành danh sách số nguyên

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

Một cách khác để thực hiện điều này sẽ là sử dụng câu lệnh linq. Câu trả lời được đề xuất không hoạt động với tôi trong .NetCore2.0. Tôi đã có thể tìm ra nó tuy nhiên và dưới đây cũng sẽ hoạt động nếu bạn đang sử dụng công nghệ mới hơn.

[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

Bạn có thể sử dụng nó thông qua LINQ

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

Có vẻ khá lãng phí đối với TryPude, nó mang lại cho bạn giá trị, sau đó chỉ cần ném giá trị đó ra ngoài cửa sổ để thực hiện Parse. Về cơ bản, bạn đang phân tích cú pháp gấp đôi.
Ristogod


0

Điều này có thể là quá mức cho vấn đề đơn giản này. Nhưng đối với các phương thức Thử làm liên quan đến Linq, tôi có xu hướng sử dụng các lớp ẩn danh để có mã biểu cảm hơn. Nó tương tự như câu trả lời từ 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
Xem xét thêm một số giải thích bằng văn bản về câu trả lời của bạn, thay vì chỉ cung cấp mã.
carlosfigueira

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

Xin chào Patryk. Chào mừng bạn đến với StackOverflow. Sẽ tốt hơn nếu bạn có thể viết thêm một chút mô tả về giải pháp ngắn gọn súc tích mà bạn đã đăng. Đây là câu trả lời cho một câu hỏi rất cũ trên trang web này và sẽ được xem xét bởi một số người dùng.
Aditya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.