我正在寻找一种方法来为我的列表对象提供一个自动从1增加到(无论多少)的ID。
这是我使用的课程
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
public string Director { get; set; }
}
我会像这样使用这个列表:
public List<Movie> Movies { get; set; }
现在让我们说这个列表包含10部电影,我删除了ID为5的电影。我希望所有电影上的id都能改变,以便过去拥有id 6的电影现在有了id 5.可以有人点我在正确的方向?
答案 0 :(得分:1)
这可能是简单的,但为什么不使用List本身的索引作为id?它可以很好地适用于您描述的场景。然后,Id
类中不需要Movie
属性。
如果你有一个你没有描述的更复杂的案例,你可能需要实现像引用计数器这样的东西来跟踪所有Movie
生命周期。
答案 1 :(得分:1)
如何为电影列表创建包装并让该类处理ID?
public class MoviesList
{
public List<Movie> Movies;
public MoviesList()
{
Movies=new List<Movie>();
}
public void Add(Movie movie)
{
var highestId = Movies.Any() ? Movies.Select(x => x.Id).Max():1;
movie.Id = highestId + 1;
Movies.Add(movie);
}
}
答案 2 :(得分:1)
您可以使用Add
和Remove
方法创建自定义集合之类的内容。这样,您在添加新项目时也无需指定ID
。
public class Movies
{
public List<Movie> List { get; set; }
public Movies()
{
List = new List<Movie>();
}
public void Add(Movie newMovie)
{
newMovie.Id = List.Count > 0 ? List.Max(x => x.Id)+1 : 1;
List.Add(newMovie);
}
public void Remove(Movie oldMovie)
{
List.Remove(oldMovie);
List.ForEach((x) => { if (x.Id > oldMovie.Id) x.Id = x.Id - 1; });
}
}
出于测试目的:
Movies movies = new Movies();
movies.Add(new Movie() { Director = "first", Title = "first" });
movies.Add(new Movie() { Director = "second", Title = "second" });
movies.Add(new Movie() { Director = "third", Title = "third" });
movies.Add(new Movie() { Director = "fourth", Title = "fourth" });
movies.Add(new Movie() { Director = "fifth", Title = "fifth" });
movies.Remove(movies.List[3]);
答案 3 :(得分:0)
我将从List<Movie>
对象继承并覆盖它的基本添加/删除功能,在添加/删除时递增和重新设置值,使用列表的索引作为id的基础,这样的事情(没有真正测试过) -
public class MovieList : List<Movie>
{
public new void Add(Movie m)
{
base.Add(m);
m.Id = this.IndexOf(m);
}
public new void Remove(Movie m)
{
base.Remove(m);
m.Id = -1;
Reseed();
}
public new void RemoveAt(int index)
{
Movie m = this[index];
this.Remove(m);
}
public new int RemoveAll(Predicate<Movie> match)
{
List<Movie> removing = new List<Movie>();
foreach (Movie m in this)
if (match(m))
removing.Add(m);
foreach (Movie m in removing)
{
this.Remove(m);
}
return removing.Count;
}
public new void RemoveRange(int index, int count)
{
for (int i = index; i < count; i++)
{
Movie m = this[i];
this.Remove(m);
}
}
public new Movie this[int index]
{
get
{
return base[index];
}
set
{
base[index] = value;
Reseed();
}
}
private void Reseed()
{
foreach (Movie x in this)
{
x.Id = this.IndexOf(x);
}
}
}
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
public string Director { get; set; }
}
答案 4 :(得分:0)
在C#代码中自动生成ID的最佳方法如下。
library(shiny)
ui <- fluidPage(
dateInput("date1", "date 1"),
dateInput("date2", "date 2 = not be before date 1", min = 'input.date1')
)
server <- function(input, output) {
}
shinyApp(ui = ui, server = server)
因此,每当您创建Employee类的对象时,它将为ID属性分配一个唯一的GUID,因此无需执行其他任何操作。