什么';s是转换List<;字符串>;到列表<;int>;在C#中,假设int.Parse将适用于

本文关键字:lt int gt 假设 Parse 适用于 List 转换 字符串 什么 列表 | 更新日期: 2023-09-27 17:50:32

我所说的最快是指使用C#假设int将List中的每个项转换为int类型的最有效的方法。Parse将适用于每个项?

什么';s是转换List<;字符串>;到列表<;int>;在C#中,假设int.Parse将适用于

您不会绕过对所有元素的迭代。使用LINQ:

var ints = strings.Select(s => int.Parse(s));

这增加了额外的好处,它只会在你迭代它时转换,并且只转换你要求的元素。

如果您确实需要一个列表,请使用ToList方法。但是,您必须注意,上述绩效奖金届时将不可用。

如果你真的想了解最后一点性能,你可以试着用这样的指针做一些事情,但就我个人而言,我会使用其他人提到的简单linq实现。

unsafe static int ParseUnsafe(string value)
{
int result = 0;
fixed (char* v = value)
{
    char* str = v;
    while (*str != ''0')
    {
    result = 10 * result + (*str - 48);
    str++;
    }
}
return result;
}
var parsed = input.Select(i=>ParseUnsafe(i));//optionally .ToList() if you really need list

实现这一点的任何明显方法之间可能都没有什么区别:因此,请注意可读性(其他答案中发布的LINQ风格的方法之一(。

通过将输出列表初始化到所需的容量,您可能会为非常大的列表获得一些性能,但您不太可能注意到差异,可读性也会受到影响:

List<string> input = ..
List<int> output = new List<int>(input.Count);
... Parse in a loop ...

性能的轻微提升将来自于这样一个事实,即输出列表在增长时不需要重复重新分配。

我不知道性能影响是什么,但有一个List<T>.ConvertAll<TOutput>方法可以将当前List中的元素转换为另一种类型,返回一个包含转换后的元素的列表。

List.ConvertAll方法

 var myListOfInts = myListString.Select(x => int.Parse(x)).ToList()

附带说明:如果在ICollection.NET框架上调用ToList((,则会自动预分配
所需大小的列表,因此不必为添加到列表中的每个新项目分配新空间。

不幸的是,LINQ Select没有返回ICollection(正如Joe在评论中指出的那样(。

来自ILSpy:

// System.Linq.Enumerable
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
    throw Error.ArgumentNull("source");
}
return new List<TSource>(source);
}
// System.Collections.Generic.List<T>
public List(IEnumerable<T> collection)
{
if (collection == null)
{
    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
}
ICollection<T> collection2 = collection as ICollection<T>;
if (collection2 != null)
{
    int count = collection2.Count;
    this._items = new T[count];
    collection2.CopyTo(this._items, 0);
    this._size = count;
    return;
}
this._size = 0;
this._items = new T[4];
using (IEnumerator<T> enumerator = collection.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        this.Add(enumerator.Current);
    }
}
}

因此,ToList((只调用List构造函数并传递一个IEnumerable。List构造函数足够聪明,如果它是一个ICollection,它将使用最有效的方式来填充List 的新实例