Question

J'essaie de faire classe statique, ajouter à ICollection mais j'ai eu quelques problèmes que je ne peux pas semblons surmonter. c'est-ce que je reçois donc je peux passer un ICollection dans la méthode? T est la cause qui disent qu'il ne peut pas être résolu.

et alors je me demande est-il un moyen de faire AddRange sur ICollection?

Je pensais à quelque chose comme ça, mais Maby je suis sortie de mon esprit avec elle?

public static ICollection<T> add(this IEnumerable<T> list)
    {
        ICollection<T> collection = null;

        return collection.AddRange(list);            
    }
Était-ce utile?

La solution

Non, ICollection<T> n'a pas une méthode de AddRange - et même si elle l'a fait, vous seriez essayer de déréférencer null qui jetteront un NullReferenceException. Vous n'avez pas spécifié une collection d'ajouter la liste ... qu'est-ce que vous essayez de faire exactement?

Vous pouvez créer (par exemple) un nouveau List<T> - et qui a l'avantage d'avoir déjà un constructeur qui peut prendre un IEnumerable<T>:

public static ICollection<T> Add<T>(this IEnumerable<T> list)
{
    return new List<T>(list);            
}

Cependant, à ce moment-là que vous avez vraiment juste réimplémentées Enumerable.ToList() et lui a donné un type de retour différent ...

Si vous voulez ajouter tout à une collection existante, vous voudrez peut-être quelque chose comme ceci:

public static ICollection<T> AddTo<T>(this IEnumerable<T> list,
                                      ICollection<T> collection)
{
    foreach (T item in list)
    {
        collection.Add(item);
    }
    return collection;
}

Autres conseils

Si je comprends bien, vous voulez ajouter un IEnumerable<T> à une collection vide.

Ne serait-il plus facile de le faire:

ICollection<MyObject> collection = new List<MyObject>(GetIEnumerableOfMyObject());

Ou même:

ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList();

Les autres moyens semblent supposer que votre ICollection est vide et / ou votre ICollection est un type de liste. Cependant, si vous voulez AddRange, vous pouvez étendre la classe ICollection comme suit:

public static void AddRange<T>(this ICollection<T> ic, IEnumerable<T> ie)
{
    foreach (T obj in ie)
    {
        ic.Add(obj);
    }
}

Il faut toutefois noter que depuis la liste impliments ICollection, cela peut provoquer une ambiguïté en traitant directement avec les objets de la liste (bien que je ne l'ai pas encore testé si le compilateur sera en mesure de le résoudre - ma réaction instinctive est qu'il devrait, cependant, puisque AddRange est membre de la liste et le compilateur passera par les fonctions membres avant de regarder les extensions, mais si je me trompe, je suis sûr que quelqu'un va me corriger).

En fonction du type de collection de votre liste source une autre approche consiste à utiliser List(T).ForEach , comme dans:

List<string> source = ...
ICollection<string> dest = ...

source.Foreach(dest.Add);

Cependant, la lisibilité de c'est facile à contester .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top