Aggiunta di un elemento di un array

I m la lettura dei dati da una fonte come array. a[n]

Ho bisogno di aggiungere un elemento all’array.

Una volta che ho l’array, ho creato un nuovo array con capacità di n+1 e di copiare tutti gli elementi dell’array e inserire il nuovo elemento come l’ultimo elemento dell’array.

Che posso fare questo.

C’è un modo migliore per fare questo? soprattutto con Linq?

  • Si prega di non mettere i tag come “C#” nel titolo. Basta lasciare i tag i tag, che è dove i tag di appartenenza.
InformationsquelleAutor DarthVader | 2010-06-30



9 Replies
  1. 8

    Quello che hai descritto è davvero l’unico modo per farlo. Gli array non possono essere ridimensionata .NET, in modo dobbiamo allocare un nuovo array e copiare il vecchio in esso. Per esempio, questo è come Array.Resize opere. LINQ non è davvero un aiuto qui, e se fosse, sarebbe solo la proiezione di array esistente in un nuovo “caso”, che è esattamente quello che abbiamo appena descritto.

    Se si ha la necessità di ridimensionare l’array spesso, si dovrebbe considerare l’utilizzo di un ArrayList o, se possibile, un fortemente tipizzato List<T>.

    Modifica:
    Se siete semplicemente per ottenere un Array con un metodo che non puoi controllare, ma all’interno del codice si potrebbe utilizzare un IEnumerable<T> invece, è possibile utilizzare LINQ per i più pigri-enumerare e di ricambio extra matrice di allocazione:

    var mySequence = originalArray.Concat(new[]{myobj});
    
    //snip
    
    foreach(var item in mySequence)
    {
        //do stuff
    }

    È solo quando la chiamata ToArray() che noi sosteniamo l’overhead aggiuntivo. Altrimenti stiamo semplicemente facendo un singolo enumerazione tramite l’array originale e poi furtivamente la voce in più(s) alla fine.

    • purtroppo, l’origine dei dati restituisce array, non posso farne a meno.
    • cosa c’è di fermare la tua modifica dell’origine dati di un Elenco, una volta che si riceve? Perché tenerlo come un inflessibile array?
    • perché devo memorizzare di nuovo, come un array. quindi, cambiare un elenco e poi di nuovo in un array è un eccessivo no?
    • quindi, metodo Add() funziona allo stesso modo (crea nuovo array) ?
    • cosa Add metodo ti riferisci?
    • Metodo Add dell’Elenco<T>
    • questa domanda è di circa il ridimensionamento di matrici. List<T> non è come un array.

  2. 6

    Se si desidera mettere a matrici insieme utilizzando LINQ, è possibile utilizzare Concat:

    var combined = array1.Concat(new[] { element }).ToArray();

    Tuttavia, è ora la creazione di un numero di differenti matrici per la vostra collezione. Una scelta migliore sarebbe quello di utilizzare solo un Elenco. Sarà supportato da un singolo array e ampliato automaticamente per voi.

  3. 5

    C# rendimento (no extra storage necessario)

    Utilizzando C# resa consente di restituire l’array e di più, senza che mai l’allocazione di spazio di archiviazione aggiuntivo. Dopo producendo ogni elemento dell’array originale si può scivolare in qualsiasi extra elementi facilmente in questo modo:

    IEnumerable<int> GetEverything() {
    
        //first return the entire original array
        foreach(int num in arrNumbers)
            yield return num;
    
        //then slip in extra element at the end
        yield return 5;   //yield even more elements if you want...
    }

    e quindi si può usare in questo modo:

    foreach (int n in GetEverything())
        Console.WriteLine(n);

    Non c’è reale bisogno di tirare fuori LINQ in questa situazione, in quanto l’istruzione yield è semplice e proprio adatte il vostro bisogno.

    • molto bella soluzione
  4. 3

    Che si potrebbe utilizzare l’array per inizializzare un elenco.

    var stuff = new List<object>( a );
    stuff.Add( moreStuff );
    • Si dovrebbe utilizzare un elenco fortemente tipizzato.
    • Sostituire object con SomeType
    • L’OP dice nulla su che tipo lui sta lavorando, e mi viene da supporre che egli sa come usare una lista generica. È davvero questo il punto.
    • Se l’OP è una domanda elementare come c’è qualche modo per creare un array di ridimensionamento, non si deve fare alcuna ipotesi sulla sua conoscenza di insiemi Generici, o la sua conoscenza dei problemi di prestazioni di fusione/boxing/unboxing oggetti in insiemi generici. FFS, dichiarando Elenco oggetto<> sconfigge l’intero punto generico collezione! Si potrebbe anche usare un Arraylist, a questo punto.
    • Se l’OP non capire lo scopo di generici il mio consiglio sarebbe quello di interrompere questo progetto interamente e iniziare a leggere per principianti tutorial.
  5. 3

    È possibile utilizzare Array.Resize per questo:
    http://msdn.microsoft.com/en-us/library/bb348051.aspx

    Sostanzialmente fa quello che hai fatto manualmente, ma è un po ‘ più ordinato.

    Se si aggiunge più di un elemento all’array su base regolare, mi consiglia di movimento per un elenco anche se, come si sta andando ad essere più efficiente per gli inserimenti.

  6. 0

    Utilizzare un List<T> invece, e chiamata myList.Add(item)

    Edit: se intendi dire che stai ricevendo i dati da un array (di non leggere i dati in uno), utilizzare la funzione di costruzione per la Lista alla copia dell’array.

  7. 0

    È possibile utilizzare il ToArray e ToList Linq comandi.

    Ecco un generico metodo che restituisce un nuovo array che sarebbe una copia dell’originale con il nuovo elemento.

    public static T[] AddItem<T>( T[] array, T item )
    {
        List<T> list = array.ToList();
        list.Add( item );
        return list.ToArray();
    }

    Ecco un generico metodo di estensione per aggiungere un elemento in un array. (L’array sarebbe una nuova in memoria, quindi potrebbe avere effetti collaterali).

    public static void AddItem<T>( this T[] array, T item )
    {
        List<T> list = array.ToList();
        list.Add( item );
        array = list.ToArray(); /* Untested, this may not compile! */
    }
    • Questo è leggermente peggiore, semplicemente copiando la vecchia matrice direttamente in una nuova.
    • Sono d’accordo che non è il modo più efficace per probabilmente gestire questo. Mi piace il tuo uso del metodo Concat. Ho trascurato il fatto che uno. Ho fino votato la tua risposta.
    • Hai effettivamente provato che il metodo di estensione? Perché se funziona, significa che il this argomento viene passato per riferimento, che vorresti farmi una sorpresa.
    • purtroppo non ho il test di routine, è stato un ripensamento.
    • Ho aggiornato il codice di esempio per lasciare che qualcuno sa che potrebbe non funzionare. Ho deciso di lasciarlo perché penso che un metodo di estensione per questo può ancora essere una buona soluzione.
    • Penso che sarà di compilazione; semplicemente non hanno alcun effetto.

  8. 0

    è possibile utilizzare qualcosa di simile a questo, se si dispone di matrici dello stesso tipo {ArrayVar1,ArrayVar2}

    var arrayList = ArrayVar1.ToList();
    arrayList.AddRange(ArrayVar2); //or for single element use arrayList.Add(Var2);
    ArrayVar1=arrayList.ToArray();
  9. 0

    Esempio di utilizzo di Array metodi di Ridimensionamento e ConstrinedCopy. Non c’è bisogno di fare altre matrici.

    Filter[] filterA = new Filter[] {
          new Filter() { field = "trans_date", Data = "2018-01-01", Op = "gt" }
          , new Filter() { field = "trans_date", Data = "2018-01-02", Op = "gt" }
          , new Filter() { field = "trans_date", Data = "2018-01-03", Op = "gt" }
    };
    
    Filter[] filterB = new Filter[] {
          new Filter() { field = "trans_date", Data = "2018-01-04", Op = "gt" }
          , new Filter() { field = "trans_date", Data = "2018-01-05", Op = "gt" }
    };
    
    
    //resizing the original array to hold all the new elements.
    Array.Resize(ref filterA, filterA.Length + filterB.Length);
    
    //take the items from filterB and place them in filterA
    Array.ConstrainedCopy(filterB, 0, filterA, 3, 2);

Lascia un commento