4

我有课程预订

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 等等...

任何建议

4

6 回答 6

9

以下将为您提供一份新预订列表,其中包含投影到您的 ID 属性中的索引。您可能可以执行类似的操作来使用索引更新现有列表...

var myBookings = myExistingListOfTen.Select((b, index) => new Booking
                 {
                     Id = index + 1, 
                     From=b.From, 
                     To=b.To
                 });
于 2009-08-04T14:17:06.097 回答
6

不好,但它会工作。诀窍是使用提供项目索引的重载。

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

这将更新现有的预订,但您也可以选择一个设置了 id 的新实例,并避免这种丑陋return,但代价是复制预订并丢失 Scott Ivey 建议的参考。当然,如果您想要基于 1 的 id,则必须添加一个。

我也觉得以这种方式生成 id 有点奇怪,但如果你得到一个没有 id 的新预订列表并想要生成它们,它可能是一个可以接受的解决方案。在这种情况下,id 显然不应以零或一开头,而是已分配的最大 id 加一。

于 2009-08-04T14:18:03.177 回答
4

当然,如果它是对象上的属性,您希望值在调用之间保持一致。预订“A”不应具有不同的 ID,具体取决于它在列表中的位置。如果您只是想要列表中项目的索引,请不要将其存储为项目的属性,而是从其在列表中的位置派生它。

于 2009-08-04T14:22:16.510 回答
1
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; }
}
于 2009-08-04T14:21:27.167 回答
0

不确定我是否理解你的问题,但你总是可以

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

不确定这是否是个好主意(它不会表现出色)。

于 2009-08-04T14:17:39.123 回答
0

虽然我同意@tvanfosson (+1),但如果你真的想保留一个IDBooking我认为这应该建立在 Booking 的构建上。你可以有类似 Booking Context 的东西,其中每个上下文都会创建带有序列 ID 的预订:

    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() { }
        }
    }
于 2009-08-04T14:42:15.743 回答