如何将List<string>转换为List<int>?

212

我的问题是这个问题的一部分:

我从一个表单中收到了一组ID。我需要获取这些ID,并将它们转换为整数,然后从数据库中选择匹配的记录。

[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);
}
15个回答

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

引发异常 - LINQ to Entities 不识别 'Int32 IndexOf(Char)' 方法,该方法无法转换为存储表达式。 .NET 4.0 - markthewizard1234
9
如果你的 listofIDs 是一个未被执行的 IQueryable<string>,那么就会发生这种情况。在进行转换之前,请先使用 ToList() 执行它:listofIDs.ToList().Select(int.Parse).ToList()。@markthewizard1234 - Michael Hornfeck
我相信在2013年这个方法是可行的,但是现在对我来说已经不再有效了。下面使用linq语句添加了一个更新的选项。 - Brandon Turpy
2
如果任何一个字符串实际上不是整数,这将抛出异常。请参见下面的安全版本。 https://dev59.com/YW025IYBdhLWcg3wIyKf#48712010 - BA TabNabber
@MichaelHornfeck 第一个ToList应该是AsEnumerable,不需要分配第二个List。 - Ronan Thibaudau

48

这里是一个安全的变体,可以过滤掉无效的整数:

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

它使用了在C#7.0中引入的out变量。

另一种变体返回一个可空整数列表,其中插入了null条目以表示无效的整数(即保留原始列表计数):

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

非常感谢!以下是适用于C# 6.0版本的代码:https://dev59.com/YW025IYBdhLWcg3wIyKf#48712010 - BA TabNabber

46

Using Linq ...

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

22

为什么没有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();

感谢Olivier Jacot-Descombes提供的灵感和C# 7.0版本。


15

使用Linq:

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

1
var intList = stringList.Select(Convert.ToInt32).ToList()将字符串列表转换为整数列表 - shivani

9
我知道这是一篇老文章,但我认为这是一个很好的补充: 您可以使用 List<T>.ConvertAll<TOutput>
List<int> integers = strings.ConvertAll(s => Int32.Parse(s));

1
这可以简化为 List<int> integers = strings.ConvertAll(int.Parse); - David Hammond

2

将字符串值转换为整数列表

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

1

我认为这是最简单的方法:

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

6
我经常在lambda表达式中看到这种模式: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版本的Select之间存在歧义调用。 - goodeye

1

对于这个简单的问题,这可能有些过度。但是对于与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();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接