C# 转换列表<;字符串>;列出<;int>;在C中#

C# 转换列表<;字符串>;列出<;int>;在C中#,c#,C#,我想将列表转换为列表 这是我的密码: 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])); } ) void转换(列表字符串列

我想将
列表
转换为
列表

这是我的密码:

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]));  
    }
)
void转换(列表字符串列表)
{
List intList=新列表();
对于(int i=0;i
使用Linq:

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

如果您不想使用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;
}
列表转换(列表字符串列表)
{
List intList=新列表();
对于(int i=0;i
请注意,如果字符串列表包含不可解析为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;
}
列表转换(列表字符串列表)
{
List intList=新列表();
foreach(stringList中的字符串s)
{  
intList.Add(int.Parse(s));
}
返回intList;
}

您的方法工作正常,因此我假设您是一名仍在学习该语言语法的初学者。我现在不会给您高级LINQ解决方案,但会帮助您使用当前代码实现所需功能。您当前没有返回正在创建的列表,因此请从以下位置更改方法签名:

void Convert(List<string> stringList)
然后在代码中可以这样调用它:

List<string> strings = new List<string> { "1", "2", "3" };
List<int> integers = this.Convert(strings);
List strings=新列表{“1”、“2”、“3”};
列表整数=this.Convert(字符串);
注意:如果您不想让代码抛出异常,我建议使用
TryParse
而不是
Parse
,但是要小心,因为此方法的工作方式略有不同,并且使用了
out
参数。您可以了解更多信息


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

我建议使用
TryParse()
,以防某些值无法转换为
int
。 为此,我创建了一个扩展方法

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;

    }
}
void Main()
{
列表源列表=新列表{“1”、“2”、“3”、“qwert”、“4”、“5”、“6”、“7”、“asdf”、“9”、“100”、“22”};
//Dump是一个仅限LinqPad的方法。请忽略
sourceList.ConvertToInt().Dump();
}
静态公共类助手方法
{
静态公共列表转换(此列表stringList)
{
int x=0;
var intList=stringList.Where(str=>int.TryParse(str,out x))
.选择(str=>x)
.ToList();
返回intList;
}
}
在这种情况下,只解析数值int值,其余的被正常忽略。如果需要,可以内置一些错误处理/通知

/Edit 根据建议,这里有一种基于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;      
}
静态公共IEnumerable转换项(此IEnumerable源)
{
int x=0;
var result=source.Where(str=>int.TryParse(str,out x))
.选择(str=>x);
返回结果;
}

有了这个功能,您只需在调用
ConvertToInt()
之前调用
AsEnumerable()
,结果当然是
IEnumerable
类型,从现在开始,您可以使用
.ToList()
或数组或任何您需要的东西轻松地将其转换为列表。

而不是使用LINQ

List intList=stringList.ConvertAll(int.Parse);

如果您的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

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

请使用以下代码:

int x = 0;

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

同样请参见。您应该以某种方式保留
intList
。将
void
更改为
intList
是很自然的,并且
返回intList;
@user2939293您是csharp的初学者吗?@user2939293,下面有很多答案,每个人都试过了。您应该接受一个符合您要求的答案。Si可能重复由于lambda箭头左侧的参数列表
=>
Parse
方法的参数列表相同,因此可以简化为
…Select(int.Parse)..
@Peter Kiss,这可能会引发“输入字符串格式不正确”的常见异常…当然,但可能这不是问题。谁知道呢?可能问题是在int.TryParse之后使用一些假返回值隐藏异常,如-1?这很好,但在这种情况下,使用
foreach
而不是
for
或Linq,如您所写。如果使用新列表实例转换已在内存中的另一个集合中的项目,则使用其Count()或Length来创建新列表以指定其大小。对于大型集合,始终为新列表中的项目分配更多空间可能是一个性能问题(新列表中只有一个空数组)。谢谢,我将使用foreach Instead。我发现Linq更难,因此更喜欢使用其他东西。他是一个初学者,为什么你使用扩展方法,Linq和所有东西来迷惑他……这个答案不仅是针对OP的。其他用户可能会在某一天搜索此问题的答案,并且可能希望多次重复使用。因此,我需要一个扩展我已经删除了我最初的评论,因为我认为这不合适。我认为
List<int> intList = stringList.ConvertAll(int.Parse);
        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
        yourIntegerList = yourIntegerList.Where(a => a != -1).ToList();
int x = 0;

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