如何检查项目是否已在存储库列表中?

Ale*_*o H 3 c#

好的,所以这里有一些例外,我无法List<Dvd> Dvds = _dvds.ReadAll();在DvdController.cs中使用,如果dvd已在列表中,请检查它是否包含dvd信息。即使我确实这样做了,它也无法按我的预期工作。即使我检查该信息是否在列表中并尝试将其停止,它仍会将其添加到列表中。Dvd.cs确实将Id递增了一个。我想知道对此有什么解决方案?

DvdController.cs

...
private void CreateDvd() //Create
    {
        var myView = new DvdView();
        var dvdInfos = myView.GetNewDvdInfo();

        _dvds.Create(dvdInfos);
        DisplayDvds();
    }
...
Run Code Online (Sandbox Code Playgroud)

DvdRepository.cs

public class DvdRepository
{
    private static List<Dvd> dvds = new List<Dvd>()
    {
        new Dvd("Batman", 2010, "Bruce", 4 ),
        new Dvd("Superman", 2009, "John", 4),
        new Dvd("Wonderwoman", 2012, "Omar", 4)
    };
    public Dvd Create(Dvd dvd)
    {
        if (dvds.Contains(dvd))
        {
            Console.WriteLine("duplicate"); //not working
        }
        else
            dvds.Add(dvd);

        return dvds.FirstOrDefault(d => d.Id == dvd.Id);
    }
    public List<Dvd> ReadAll()
    {
        return dvds;
    }
...
Run Code Online (Sandbox Code Playgroud)

光盘

public class Dvd
    {
        public Dvd(string title, int releaseyear, string director, float rating)
        {
            Id = Interlocked.Increment(ref globalId);
            Title = title;
            ReleaseYear = releaseyear;
            Director = director;
            Rating = rating;
        }

        public static int globalId;
        public int Id { get; private set; }
        public string Title { get; set; }
        public int ReleaseYear { get; set; }
        public string Director { get; set; }
        public float Rating { get; set; }
Run Code Online (Sandbox Code Playgroud)

Mat*_*and 6

您的检查if (dvds.Contains(dvd))正在寻找该特定对象引用。除非您已经传递了列表中的实际对象,否则它将不起作用。

您需要检查的唯一标识属性Dvd。为此,您需要使用该.Any()方法。

if (dvds.Any(x => x.Title == dvd.Title))
Run Code Online (Sandbox Code Playgroud)