24

我想将 a 转换List<string>List<int>.

这是我的代码:

void Convert(List<string> stringList)
{
    List<int> intList = new List<int>();  
    for (int i = 0; i < stringList.Count; i++) 
    {  
        intList.Add(int.Parse(stringList[i]));  
    }
)
4

8 回答 8

47

您可以使用而不是使用 LINQList<T>.ConvertAll<TOutput>(...)

List<int> intList = stringList.ConvertAll(int.Parse);
于 2013-11-02T09:48:48.560 回答
15

我建议使用TryParse(),以防某些值无法转换为int. 为此,我创建了一个扩展方法。下面是我的演示 LinqPad 代码。

void Main()
{
    List<string> sourceList = new List<string> {"1", "2","3", "qwert","4", "5","6", "7","asdf", "9","100", "22"};
    //Dump is a LinqPad only method. Please ignore
    sourceList.ConvertToInt().Dump();
}

static public class HelperMethods
{
    static public List<int> ConvertToInt(this List<string> stringList)
    {
        int x = 0;
        var intList = stringList.Where(str => int.TryParse(str, out x))
                                .Select (str => x)
                                .ToList();
        return intList;

    }
}

在这种情况下,只有数字 int 值被解析,其余的被优雅地忽略。如果你愿意,你可以内置一些错误处理/通知。

/Edit 基于Peter Kiss 的建议,这里是一种基于 IEnumerable 接口的更通用的方法。

static public IEnumerable<int> ConvertToInt(this IEnumerable<string> source)
{
    int x = 0;
    var result = source.Where(str => int.TryParse(str, out x))
                        .Select (str => x);

    return result;      
}

有了这个,你只需要在调用AsEnumerable()之前调用ConvertToInt()结果当然是类型,从这里开始,你可以通过使用或数组或任何你需要的东西IEnumerable<Int32>轻松地将它转换为列表。.ToList()

于 2013-11-02T09:26:08.883 回答
5

使用 Linq:

var intList = stringList.Select(x => int.Parse(x)).ToList();
于 2013-11-02T09:01:18.413 回答
3

使用以下代码:

int x = 0;

var intList= stringList.Where(str => int.TryParse(str, out x)).Select(str => x).ToList();
于 2014-02-10T11:01:25.923 回答
1

谢谢大家。能在这里得到多少帮助真是太棒了!我终于通过将字符串列表转换为数组,然后将数组转换为 int 来解决问题。也许不是最聪明的解决方案,但我的代码现在可以工作了。稍后我会尝试您的建议,看看我是否仍然可以使用列表而不是数组。谢谢大家!

于 2013-11-02T11:20:48.087 回答
1

如果您不想使用 Linq(我总是觉得很难理解),那么您的代码看起来是正确的,但是您当然需要返回一些内容:

List<int> Convert(List<string> stringList)
{
    List<int> intList = new List<int>();  

    for (int i = 0; i < stringList.Count; i++) 
    {  
        intList.Add(int.Parse(stringList[i]));  
    }
    return intList;
}

请注意,如果字符串列表包含不可解析为 int 的内容,这将引发异常。

编辑: 更好的是,使用 foreach 循环:

List<int> Convert(List<string> stringList)
{
    List<int> intList = new List<int>();  

    foreach(String s in stringList) 
    {  
        intList.Add(int.Parse(s));  
    }
    return intList;
}
于 2013-11-02T09:04:50.977 回答
0

您的方法运行良好,因此我假设您是仍在学习该语言语法的初学者开发人员。我暂时不会为您提供高级 LINQ 解决方案,但会帮助您使用当前代码实现您想要的。您当前没有返回您正在创建的列表,因此将方法签名更改为:

void Convert(List<string> stringList)

至:

List<int> Convert(List<string> stringList)

并在方法结束之前的最后添加:

return intList;

然后在你的代码中你可以这样调用它:

List<string> strings = new List<string> { "1", "2", "3" };
List<int> integers = this.Convert(strings);

注意:如果您不希望您的代码引发异常,我建议您使用TryParse而不是Parse,但是要小心,因为此方法的工作方式略有不同并使用out参数。您可以在此处了解更多信息。

如果您对 LINQ 感兴趣,@Peter Kiss 的解决方案将尽其所能。他正在使用带有方法语法的 LINQ,但也有类似 SQL 的语法,您可能会或可能不会觉得更容易掌握。可以在此处找到对 LINQ 的一个很好的介绍。

于 2013-11-02T09:07:09.657 回答
-1

如果您的 stringList 有一个无法解析的字符串,那么您可以使用默认的错误/无效值 -1 来屏蔽它,而不是遇到如下异常:

        List<string> stringList = new List<string>();
        stringList.AddRange(new string[] { "1", "2", "3", "4", "sdfsf", "7" }); // for illustration
        int temp;
        var yourIntegerList = stringList.Select(x => int.TryParse(x, out temp) ? int.Parse(x) : -1).ToList(); // -1 used here, can be any integer

// 现在你可以删除所有的 -1

        yourIntegerList = yourIntegerList.Where(a => a != -1).ToList();
于 2013-11-02T10:07:19.443 回答