Domanda

Ho un corso di prenotazione

public class Booking
    {
        public int Id { get; set; }

        public string From { get; set; }

        public string To { get; set; }
    }

Creo un elenco di prenotazioni con l'aiuto di linq e voglio un meccanismo con il quale voglio generare automaticamente la proprietà 'Id' per incrementare di 1.

vale a dire. se le prenotazioni della lista contengono 10 oggetti di prenotazione, allora l'id del primo oggetto = 1, il secondo id = 2 e quindi uno ...

qualsiasi suggerimento

È stato utile?

Soluzione

Quanto segue ti fornirà un elenco di NUOVE prenotazioni con l'indice proiettato nella tua proprietà ID. Probabilmente potresti fare qualcosa di simile a questo per aggiornare l'elenco esistente con l'indice ...

var myBookings = myExistingListOfTen.Select((b, index) => new Booking
                 {
                     Id = index + 1, 
                     From=b.From, 
                     To=b.To
                 });

Altri suggerimenti

Non è carino, ma funzionerà. Il trucco è usare il sovraccarico che fornisce l'indice dell'articolo.

list = list.Select((item, index) => { item.Id = index; return item; });

Questo aggiornerà le prenotazioni esistenti, ma potresti anche selezionare una nuova istanza con l'id impostato ed evitare questo brutto ritorno al costo di duplicare le prenotazioni e perdere i riferimenti come suggerisce Scott Ivey. E ovviamente devi aggiungerne uno se vuoi ID basati su uno.

Trovo un po 'strano generare id in questo modo, ma potrebbe essere una soluzione accettabile se si ottiene un elenco di nuove prenotazioni senza ID e si desidera generarle. In questo caso gli ID non dovrebbero ovviamente iniziare con zero o uno, ma l'id più grande già assegnato più uno.

Sicuramente se si tratta di una proprietà sull'oggetto, si desidera che il valore sia coerente dall'invocazione all'invocazione. La prenotazione "A" non dovrebbe avere un ID diverso a seconda di dove esiste nell'elenco. Se desideri semplicemente l'indice dell'elemento nell'elenco, non archiviarlo come proprietà dell'elemento, ma derivalo dalla sua posizione nell'elenco.

public class Booking
{
    private static int BookingCount = 1;

    public Booking()
    {
       Id = BookingCount++;
    }

    public int Id { get; set; }

    public string From { get; set; }

    public string To { get; set; }
}

Non sono sicuro di aver capito bene la tua domanda, ma potresti sempre

ID = bookings.Select(b=>b.ID).Max()+1;

Non sono sicuro che sia una buona idea (non sarà super performante).

Anche se sono d'accordo con @tvanfosson (+1), se vuoi davvero mantenere un ID in Booking penso che questo dovrebbe essere impostato sulla costruzione di Booking . Potresti avere qualcosa come un contesto di prenotazione in cui ogni contesto creerebbe prenotazioni con ID seriali:

    public class Booking
    {
        protected Booking() { }
        public int Id { get; set; }

        public string From { get; set; }

        public string To { get; set; }
    }

    public class BookingContextFactory
    {
        private int count;

        public BookingContextFactory() : this(0) { }
        public BookingContextFactory(int startValue) 
        {
            count = startValue;
        }

        public Booking CreateBooking(string from, string to)
        {
            return new InternalBooking { Id = count++, From = from, To = to };
        }

        private class InternalBooking : Booking
        {
            public InternalBooking() : base() { }
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top