列表中的自动增量ID

时间:2014-05-11 09:55:39

标签: c# asp.net-mvc list

我正在寻找一种方法来为我的列表对象提供一个自动从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.可以有人点我在正确的方向?

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)

您可以使用AddRemove方法创建自定义集合之类的内容。这样,您在添加新项目时也无需指定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,因此无需执行其他任何操作。