последовательный автоматически сгенерированный идентификатор с помощью linq

StackOverflow https://stackoverflow.com/questions/1227759

Вопрос

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

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

        public string From { get; set; }

        public string To { get; set; }
    }

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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; }
}

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

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

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

Хотя я согласен с @tvanfosson (+1), если вы действительно хотите сохранить ID в 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() { }
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top