Wie vermeiden Sie eine redundante temporäre Kopie bei Verwendung des Sammlungsverteilungselements?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie vermeiden Sie eine redundante temporäre Kopie bei Verwendung des Sammlungsverteilungselements?

Post by Anonymous »

Ich schreibe einen unveränderlichen Sammelentyp, der ein Array einpackt. Ich möchte, dass der Sammlungsbetreiber so effizient wie möglich mit meinem Sammelart arbeitet. < /P>

Code: Select all

MyCollection coll = new MyCollection([1, 2, 3]);
MyCollection myColl = [.. coll];
Angesichts der folgenden Implementierung (minimaler Repress) wird die zweite Zeile hier zuerst aufgerufen. Mein Konstruktor muss dann erneut zuweisen und kopieren, da es kein Array zugrunde liegende Array gibt oder irgendetwas, das ich direkt verwenden kann, auch wenn ich es wollte. Der Compiler möchte wirklich, dass Sie eine Methode bereitstellen, die in ReadOnlySpan und sonst nichts annimmt. Ich habe versucht, eine Array -Überladung hinzuzufügen und es würde sie nicht wählen. In Bezug auf die Implementierung verschiedener Schnittstellen wird iCollection zumindest kopiert aufgerufen und ich kann steuern, wie das funktioniert, aber das vermeidet keine Kopie. Der C# Compiler ruft ImmUTableCollectionsMarshal.asimmutablearray bzw. Enumerable.tolist auf. (Anmerkung: Sharplab.io gibt eine andere (schlechtere) Codegenerierung von dem, was ich in den neuesten vs.).

Code: Select all

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();
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post