web-dev-qa-db-fra.com

Code à ajouter à IEnumerable

J'ai un énumérateur comme celui-ci

IEnumerable<System.Windows.Documents.FixedPage> page;

Comment puis-je y ajouter une page (par exemple: D:\newfile.txt)? J'ai essayé Add, Append, Concat etc. Mais rien n'a fonctionné pour moi.

22
Sudha

Oui, c'est possible

Il est possible de concaténer des séquences (IEnumerables) ensemble et d'affecter le résultat concaténé à une nouvelle séquence. (Vous ne pouvez pas modifier la séquence d'origine.)

La fonction intégrée Enumerable.Concat() ne concatène qu'une autre séquence; cependant, il est facile d'écrire une méthode d'extension qui vous permettra de concaténer un scalaire à une séquence.

Le code suivant montre:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    public class Program
    {
        [STAThread]
        private static void Main()
        {
            var stringList = new List<string> {"One", "Two", "Three"};

            IEnumerable<string> originalSequence = stringList;

            var newSequence = originalSequence.Concat("Four");

            foreach (var text in newSequence)
            {
                Console.WriteLine(text); // Prints "One" "Two" "Three" "Four".
            }
        }
    }

    public static class EnumerableExt
    {
        /// <summary>Concatenates a scalar to a sequence.</summary>
        /// <typeparam name="T">The type of elements in the sequence.</typeparam>
        /// <param name="sequence">a sequence.</param>
        /// <param name="item">The scalar item to concatenate to the sequence.</param>
        /// <returns>A sequence which has the specified item appended to it.</returns>
        /// <remarks>
        /// The standard .Net IEnumerable extensions includes a Concat() operator which concatenates a sequence to another sequence.
        /// However, it does not allow you to concat a scalar to a sequence. This operator provides that ability.
        /// </remarks>

        public static IEnumerable<T> Concat<T>(this IEnumerable<T> sequence, T item)
        {
            return sequence.Concat(new[] { item });
        }
    }
}
7
Matthew Watson

IEnumerable<T> ne contient aucun moyen de modifier la collection.

Vous devrez implémenter ICollection<T> ou IList<T> car ceux-ci contiennent des fonctions Ajouter et Supprimer.

8
Mark Broadhurst

Si vous avez une idée de ce qu'est le type d'origine de l'IEnumerable, vous pouvez le modifier ...

List<string> stringList = new List<string>();
stringList.Add("One");
stringList.Add("Two");
IEnumerable<string> stringEnumerable = stringList.AsEnumerable();
List<string> stringList2 = stringEnumerable as List<string>;

if (stringList2 != null)
    stringList2.Add("Three");

foreach (var s in stringList)
    Console.WriteLine(s);

Cela produit:

One
Two
Three

Modifiez l'instruction foreach pour itérer sur stringList2, ou stringEnumerable, vous obtiendrez la même chose.

La réflexion peut être utile pour déterminer le type réel de IEnumerable.

Ce n'est probablement pas une bonne pratique, cependant ... Tout ce qui vous a donné l'IEnumerable ne s'attend probablement pas à ce que la collection soit modifiée de cette façon.

6
Steve

IEnumerable<T> est une interface en lecture seule. Vous devez utiliser un IList<T> à la place, qui fournit des méthodes pour ajouter et supprimer des éléments.

5
Fredrik Mörk

IEnumerable est immuable. Vous ne pouvez pas ajouter d'éléments, vous ne pouvez pas supprimer d'éléments.
Les classes de System.Collections.Generic renvoie cette interface afin que vous puissiez parcourir les éléments contenus dans la collection.

Depuis MSDN

Exposes the enumerator, which supports a simple iteration over a collection of a specified type.

Voir ici pour la référence MSDN.

1
bash.d

Vous ne pouvez pas ajouter d'éléments à IEnumerable<T>, car il ne prend pas en charge les opérations d'addition. Vous devez soit utiliser une implémentation de ICollection<T>, ou lancez le IEnumerable<T> à ICollection<T> si possible.

IEnumerable<System.Windows.Documents.FixedPage> page;
....
ICollection<System.Windows.Documents.FixedPage> pageCollection 
    = (ICollection<System.Windows.Documents.FixedPage>) page

Si le casting est impossible, utilisez par exemple

ICollection<System.Windows.Documents.FixedPage> pageCollection 
   = new List<System.Windows.Documents.FixedPage>(page);

Vous pouvez le faire comme ceci:

ICollection<System.Windows.Documents.FixedPage> pageCollection
    = (page as ICollection<System.Windows.Documents.FixedPage>) ??
      new List<System.Windows.Documents.FixedPage>(page);

Ce dernier vous garantira quasiment une collection modifiable. Il est possible, cependant, lors de l'utilisation de cast, d'obtenir avec succès la collection, mais toutes les opérations de modification pour lancer NotSupportedException. C'est le cas pour les collections en lecture seule. Dans de tels cas, l'approche avec le constructeur est la seule option.

Le ICollection<T> l'interface implémente IEnumerable<T>, vous pouvez donc utiliser pageCollection partout où vous utilisez actuellement page.

1
Ivaylo Slavov

Essayer

IEnumerable<System.Windows.Documents.FixedPage> page = new List<System.Windows.Documents.FixedPage>(your items list here)

ou

IList<System.Windows.Documents.FixedPage> page = new List<System.Windows.Documents.FixedPage>(1);
page.Add(your item Here);
1
evgenyl