拆分字符串,将 ToList<int>() 转换为一行

Posted

技术标签:

【中文标题】拆分字符串,将 ToList<int>() 转换为一行【英文标题】:Split string, convert ToList<int>() in one line 【发布时间】:2010-10-29 01:02:45 【问题描述】:

我有一个包含数字的字符串

string sNumbers = "1,2,3,4,5";

我可以将其拆分然后转换为List&lt;int&gt;

sNumbers.Split( new[]  ','  ).ToList<int>();

如何将字符串数组转换为整数列表? 这样我就可以将string[] 转换为IEnumerable

【问题讨论】:

我们今天有完全相同的问题:Click me 在“一条线”中是非常强是非常严格的要求! 这个问题专门说要拆分一串数字,这样可以使答案简单。 Dario 提到的问题处理(陷入困境?)一般字符串的 TryParse 问题。 【参考方案1】:
var numbers = sNumbers.Split(',').Select(Int32.Parse).ToList();

【讨论】:

List 有空值或 null 时会出现异常。 @SayedM.Idrees 只是在拆分前检查 null 或空。 添加空检查:var numbers = sNumbers?.Split(',').Select(Int32.Parse).ToList();【参考方案2】:

你也可以这样做而不需要 Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();

【讨论】:

【参考方案3】:

Joze 的方式也需要 LINQ,ToList()System.Linq 命名空间中。

您可以通过将数组传递给 List 构造函数来将 Array 转换为 List 而无需 Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

【讨论】:

【参考方案4】:

在 Unity3d 上,int.Parse 无法正常工作。所以我像下面这样使用。

List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
 new Converter<string, int>((s)=>return Convert.ToInt32(s);) ) );

希望对 Unity3d 用户有所帮助。

【讨论】:

【参考方案5】:

你也可以使用这个扩展方法

public static List<int> SplitToIntList(this string list, char separator = ',')

    return list.Split(separator).Select(Int32.Parse).ToList();

用法:

var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');

【讨论】:

【参考方案6】:

我的问题类似,但有时字符串包含字母(有时为空)带来了不便。

string sNumbers = "1,2,hh,3,4,x,5";

尝试遵循 Pcode Xonos 扩展方法:

public static List<int> SplitToIntList(this string list, char separator = ',')

      int result = 0;
      return (from s in list.Split(',')
              let isint = int.TryParse(s, out result)
              let val = result
              where isint
              select val).ToList(); 

【讨论】:

谢谢,虽然你声明了一个分隔符然后你没有使用它。【参考方案7】:

也可以通过int数组直接赋值。

喜欢这个

int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();

【讨论】:

【参考方案8】:

你可以用这个:

List<Int32> sNumberslst = sNumbers.Split(',').ConvertIntoIntList();

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性! 函数 ConvertIntoIntList 没有退出。 另外,您需要添加以下类: static public class HelperMethods static public List ConvertIntoIntList(this string[] stringList) int x = 0; var intList = stringList.Where(str => int.TryParse(str, out x)) .Select(str => x) .ToList();返回整数列表; 【参考方案9】:

您可以使用新的 C# 6.0 语言功能:

将委托(s) =&gt; return Convert.ToInt32(s); 替换为 对应方法组Convert.ToInt32 将冗余构造函数调用:new Converter&lt;string, int&gt;(Convert.ToInt32) 替换为:Convert.ToInt32

结果将是:

var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));

【讨论】:

【参考方案10】:

最好使用int.TryParse来避免异常;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();

【讨论】:

【参考方案11】:

既然我们有泛型,为什么还要坚持使用 int? 像这样的扩展方法呢:

    public static List<T> Split<T>(this string @this, char separator, out bool AllConverted)
    
        List<T> returnVals = new List<T>();
        AllConverted = true;
        var itens = @this.Split(separator);
        foreach (var item in itens)
        
            try
            
                returnVals.Add((T)Convert.ChangeType(item, typeof(T)));
            
            catch  AllConverted = false; 
        
        return returnVals;
    

然后

 string testString = "1, 2, 3, XP, *, 6";
 List<int> splited = testString.Split<int>(',', out _);

【讨论】:

以上是关于拆分字符串,将 ToList<int>() 转换为一行的主要内容,如果未能解决你的问题,请参考以下文章

Linq 到嵌套列表

拆分字符串并转换为可为空的 long

将 List<int> 转换为 List<int?> 的最快方法

将一个泛型集合中的数据赋给另一个泛型集合

以特定格式拆分从 int 向量创建的字符串

以递增的顺序将列表拆分为多个列表