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来保存预订。我没有任何数据库