Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 借助linq自动生成的顺序Id_C#_Linq_Sequence_Auto Generate - Fatal编程技术网

C# 借助linq自动生成的顺序Id

C# 借助linq自动生成的顺序Id,c#,linq,sequence,auto-generate,C#,Linq,Sequence,Auto Generate,我有一个班级预订 public class Booking { public int Id { get; set; } public string From { get; set; } public string To { get; set; } } 我在linq的帮助下创建了一个列表bookings,我希望使用某种机制自动生成“Id”属性,使其增量为1 也就是说,如果列表预订包含10个预订对象,那么第一个对象的Id=1,第二

我有一个班级预订

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

        public string From { get; set; }

        public string To { get; set; }
    }
我在linq的帮助下创建了一个列表bookings,我希望使用某种机制自动生成“Id”属性,使其增量为1

也就是说,如果列表预订包含10个预订对象,那么第一个对象的Id=1,第二个Id=2,依此类推


任何建议

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

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

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

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

不确定这是否是一个好主意(这不会是uber performant)。

不好,但会奏效。诀窍是使用重载提供项的索引

list = list.Select((item, index) => { item.Id = index; return item; });
这将更新现有的预订,但您也可以选择一个id设置为的新实例,并避免这种丑陋的
返回
,代价是重复预订并丢失Scott Ivey建议的引用。当然,如果您想要一个基于ID的ID,您必须添加一个


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

如果它是对象上的一个属性,您肯定希望值在不同调用之间保持一致。根据预订“A”在列表中的位置,预订“A”不应具有不同的id。如果您只是想要列表中项目的索引,请不要将其存储为项目的属性,而是从其在列表中的位置派生出来。

虽然我同意@tvanfosson(+1),但如果您确实想在
预订中保留
ID
,我认为这应该在预订的构造中设置。您可以有类似于预订上下文的内容,其中每个上下文都将使用序列ID创建预订:

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; }
}
    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() { }
        }
    }

这样你就失去了引用,没有必要进行对象实例化。对我来说,这是迄今为止最好的答案。是的。但是有更好的解决办法。是的,我同意也有。有时可以使用类似的东西,但与可能不应该使用的情况相比,这些情况非常小。我觉得这很好,你能给我上面LINQ中的示例代码的等效代码吗,即从预订中选择新的bla BLAT这是一种不好的做法,不是吗?提问者想要两个集合是什么?这将创建一个全局计数器。。。此外,我还建议使用Interlocked实现线程安全。所有其他建议均未考虑不仅可以添加预订,还可以从集合中删除预订。不过,这个问题还不够清楚。你说“我在linq的帮助下创建了一个预订列表”是什么意思?最好的办法是让数据库通过在表中指定一个“INT-IDENTITY”列来处理这些唯一的ID来保存预订。我没有任何数据库