Я пишу неизменную коллекцию типа, обернув массив. Я хотел бы, чтобы оператор спреда сбора работал как можно более эффективно с моим типом коллекции. < /P>
MyCollection coll = new MyCollection([1, 2, 3]);
MyCollection myColl = [.. coll];
Учитывая реализацию ниже (минимальная Repro), вторая строка здесь сначала вызовет перечисление. Затем мой конструктор должен снова распределить и копировать, так как нет основного массива или что -то в этом роде, что я мог бы использовать непосредственно там, даже если я хотел. Компилятор действительно хочет, чтобы вы предоставили метод, который принимает в Readonlyspan и ничего больше. Я попытался добавить перегрузку массива, и она не выберет ее. Что касается реализации различных интерфейсов, то iCollection означает, что, по крайней мере, копирование будет вызвана, и я могу контролировать, как это работает, но это не избегает копии.
Оба ImmutableearRay и List , кажется, имеют жесткие оптимизации. Компилятор c вызывает ImmutableCollectionsmarshal.asimutableArray и перечисляющую. (Примечание: sharplab.io дает различную (худшую) генерацию кода из того, что я вижу в последнем vs). < /P>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
[CollectionBuilder(typeof(MyCollection), nameof(Create))]
public class MyCollection : ICollection
{
public static MyCollection Create(ReadOnlySpan values) =>
new(values);
int[] _values;
public int Count => _values.Length;
public MyCollection(ReadOnlySpan values) =>
_values = values.ToArray();
public IEnumerator GetEnumerator() => throw new NotImplementedException();
IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException();
public bool IsReadOnly => throw new NotImplementedException();
public void Add(int item) => throw new NotImplementedException();
public void Clear() => throw new NotImplementedException();
public bool Contains(int item) => throw new NotImplementedException();
public void CopyTo(int[] array, int arrayIndex) => throw new NotImplementedException();
public bool Remove(int item) => throw new NotImplementedException();
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ad-element
Как избежать избыточной временной копии при использовании элемента разворота коллекции? ⇐ C#
Место общения программистов C#
1758590437
Anonymous
Я пишу неизменную коллекцию типа, обернув массив. Я хотел бы, чтобы оператор спреда сбора работал как можно более эффективно с моим типом коллекции. < /P>
MyCollection coll = new MyCollection([1, 2, 3]);
MyCollection myColl = [.. coll];
Учитывая реализацию ниже (минимальная Repro), вторая строка здесь сначала вызовет перечисление. Затем мой конструктор должен снова распределить и копировать, так как нет основного массива или что -то в этом роде, что я мог бы использовать непосредственно там, даже если я хотел. Компилятор действительно хочет, чтобы вы предоставили метод, который принимает в Readonlyspan и ничего больше. Я попытался добавить перегрузку массива, и она не выберет ее. Что касается реализации различных интерфейсов, то iCollection означает, что, по крайней мере, копирование будет вызвана, и я могу контролировать, как это работает, но это не избегает копии.
Оба ImmutableearRay и List , кажется, имеют жесткие оптимизации. Компилятор c вызывает ImmutableCollectionsmarshal.asimutableArray и перечисляющую. (Примечание: sharplab.io дает различную (худшую) генерацию кода из того, что я вижу в последнем vs). < /P>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
[CollectionBuilder(typeof(MyCollection), nameof(Create))]
public class MyCollection : ICollection
{
public static MyCollection Create(ReadOnlySpan values) =>
new(values);
int[] _values;
public int Count => _values.Length;
public MyCollection(ReadOnlySpan values) =>
_values = values.ToArray();
public IEnumerator GetEnumerator() => throw new NotImplementedException();
IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException();
public bool IsReadOnly => throw new NotImplementedException();
public void Add(int item) => throw new NotImplementedException();
public void Clear() => throw new NotImplementedException();
public bool Contains(int item) => throw new NotImplementedException();
public void CopyTo(int[] array, int arrayIndex) => throw new NotImplementedException();
public bool Remove(int item) => throw new NotImplementedException();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79772131/how-to-avoid-a-redundant-temporary-copy-when-using-the-collection-spread-element[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия