在C#</int> </string>中将List <string>转换为List <int>

时间:2013-11-02 08:57:46

标签: c#

我想将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]));  
    }
)

8 个答案:

答案 0 :(得分:23)

您可以使用List<T>.ConvertAll<TOutput>(...)

,而不是使用LINQ
List<int> intList = stringList.ConvertAll(int.Parse);

答案 1 :(得分:13)

我建议使用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值,并优雅地忽略其余值。如果您愿意,可以内置一些错误处理/通知。

<强> /修改 基于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()或数组或此时需要的任何内容。

答案 2 :(得分:5)

Linq:

var intList = stringList.Select(x => int.Parse(x)).ToList();

答案 3 :(得分: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;
}

答案 4 :(得分:1)

使用以下代码:

int x = 0;

var intList= stringList.Where(str => int.TryParse(str, out x)).Select(str => x).ToList();

答案 5 :(得分: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,但请注意,因为此方法的工作方式稍有不同,并使用{{ 1}}参数。您可以详细了解here

如果您对LINQ感兴趣,@ Pee Kiss的解决方案就像它一样好。他正在使用带有方法语法的LINQ,但是也有类似SQL的语法,您可能会或者可能不会更容易理解。可以找到LINQ的一个很好的介绍here

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

如果您的stringList有一个无法解析的字符串,那么您可以使用默认错误/无效值say -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();