After reading rules of Clean Code, one of them is to use default constructor when using transferring data from one collection to other
Un costruttore predefinito è uno che non ha parametri o dove tutti i parametri hanno valori predefiniti. Quindi:
var dict = new Dictionary<string,string>();
sta usando un costruttore predefinito. È altamente improbabile che qualsiasi consiglio sul codice pulito suggerisca di utilizzare tali costruttori per copiare le raccolte da una forma all'altra.
I know that LINQ is not effective
Davvero? Ancora una volta penso che tu stia usando la parola sbagliata visto che linq è incredibilmente efficace. Non è sempre l'approccio più veloce, quindi forse intendi "LINQ non è sempre il più veloce"?
So what is best for performance?
Solo tu puoi determinare ciò per la tua particolare applicazione. Quindi prenditi qualcosa come BenchmarkDotNet e confronta i due approcci.
Per quanto un indizio, hanno un'occhiata al codice sorgente e vedrai che:
var list = dict.Keys.ToList();
chiama il seguente codice:
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull(nameof(source));
}
return source is IIListProvider<TSource> listProvider
? listProvider.ToList()
: new List<TSource>(source);
}
(codice leggermente riformattato per adattarsi meglio qui)
cioè, chiama semplicemente new List<TSource>(source)
. Quindi affermare che linq è lento è un classico caso di ripetere ingenuamente un'eccessiva semplificazione piuttosto che prendersi il tempo per verificarne la validità.