последовательный автоматически сгенерированный идентификатор с помощью linq - PullRequest
4 голосов
/ 04 августа 2009

У меня есть класс бронирования

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

        public string From { get; set; }

        public string To { get; set; }
    }

Я создаю список заказов с помощью linq, и мне нужен механизм, с помощью которого я хочу автоматически сгенерировать свойство 'Id', увеличивая его на 1.

т.е. если в списке бронирований содержится 10 объектов резервирования, то у первого объекта Id = 1, у второго Id = 2 и т. д. один ...

любое предложение

Ответы [ 6 ]

9 голосов
/ 04 августа 2009

Ниже приведен список НОВЫХ бронирований с индексом, спроецированным в вашу собственность ID Возможно, вы могли бы сделать что-то подобное, чтобы обновить существующий список с индексом ...

var myBookings = myExistingListOfTen.Select((b, index) => new Booking
                 {
                     Id = index + 1, 
                     From=b.From, 
                     To=b.To
                 });
6 голосов
/ 04 августа 2009

Не приятно, но это будет работать. Хитрость заключается в том, чтобы использовать перегрузку, обеспечивающую индекс элемента.

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

Это обновит существующие заказы, но вы также можете выбрать новый экземпляр с установленным идентификатором и избежать этого ужасного return за счет дублирования заказов и потери ссылок, как предлагает Скотт Айви. И, конечно, вы должны добавить один, если вы хотите идентификаторы на основе одного.

Мне тоже немного странно создавать идентификаторы таким образом, но это может быть приемлемым решением, если вы получаете список новых заказов без идентификатора и хотите их сгенерировать. В этом случае идентификаторы должны начинаться не с нуля или единицы, а с самого большого уже назначенного идентификатора плюс один.

4 голосов
/ 04 августа 2009

Конечно, если это свойство объекта, вы хотите, чтобы значение было согласованным от вызова до вызова. Бронирование «А» не должно иметь другой идентификатор в зависимости от того, где он существует в списке. Если вам просто нужен индекс элемента в списке, не сохраняйте его как свойство элемента, а извлекайте его из его позиции в списке.

1 голос
/ 04 августа 2009
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; }
}
0 голосов
/ 04 августа 2009

Хотя я согласен с @tvanfosson (+1), если вы действительно хотите сохранить ID в Booking, я думаю, что это должно быть установлено при создании Booking. У вас может быть что-то вроде контекста бронирования, где каждый контекст будет создавать заказы с серийными идентификаторами:

    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() { }
        }
    }
0 голосов
/ 04 августа 2009

Не уверен, правильно ли я понимаю ваш вопрос, но вы всегда можете

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

Не уверен, что это хорошая идея (она не будет очень эффективной).

...