在这种情况下,AddRange()会比ToList()更快吗?

时间:2016-11-04 18:59:24

标签: c# linq list

我有一个名为ctext的逗号分隔字符串,我希望将其拆分并放入List<string>

将使用LINQ,

List<string> f = ctext.Split(',').ToList();

慢于不使用LINQ?

List<string> f;
f.AddRange(ctext.Split(','));

似乎LINQ实际上会在某个地方复制某些内容会使其变慢,而AddRange()只会检查列表的大小一次,展开它并将其转储。

还是有更快的方法吗? (比如使用for循环,但我对此表示怀疑。)

2 个答案:

答案 0 :(得分:7)

幸运的是,我们可以轻松查看ToList现在所做的开源。 (点击最新来源的链接......)

我之前没有见过AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) .setMessage("I want THIS word to be bold and the rest normal!") .create().show(); ,但我怀疑数组是否实现了它,这意味着我们基本上已经IListProvider<T>了。查看List<T>来源显示构造函数和new List<TSource>(source)基本上都使用AddRange

换句话说,除了几个间接层次之外,我希望他们都做同样的事情。

答案 1 :(得分:3)

  

似乎LINQ实际上会在某个地方复制某些内容会使其变慢,而AddRange()只会检查列表的大小一次,展开它并将其转储。

你是正确的,这两件事情都在发生,但在认为每一件事都特定于那一项行动时是错误的。 flatpickr("#dayCreate", { onDayCreate: function(dObj, dStr, fp, dayElem) { var date = moment(dayElem.dateObj).format(), value = datesForPicker[date]; if( value ){ dayElem.className += ' ' + value; } } }); ToList都执行这两项操作。两个操作都将输入序列中的所有值复制到列表中,由于它们同时添加了多个项目,因此它们能够同时查看扩展列表内部容量的程度,而不是需要进行多次扩展。