簡體   English   中英

如何檢查項目是否已存儲在存儲庫中?

[英]How to check if item is already in list in repository?

好的,所以這里有一些excepotions,我不能使用List<Dvd> Dvds = _dvds.ReadAll(); 在DvdController.cs中,如果DVD已經在列表中,請檢查它是否包含dvd信息。 即使我這樣做了,它也不像我打算那樣工作。 即使我檢查信息是否在列表中並試圖阻止它,它仍然將它添加到列表中。 順便說一下,Dvd.cs會將Id遞增1。 我想知道這會是什么解決方案?

DvdController.cs

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

        _dvds.Create(dvdInfos);
        DisplayDvds();
    }
...

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;
    }
...

Dvd.cs

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; }

檢查if (dvds.Contains(dvd))是否正在查找該特定對象引用。 除非您已經傳入列表中的實際對象,否則它將無法工作。

您需要檢查Dvd的唯一標識屬性。 為此,您需要使用.Any()方法。

if (dvds.Any(x => x.Title == dvd.Title))

另一個需要更多代碼的解決方案,但在未來的其他場景中可能會有所幫助,它會覆蓋Dvd類上的EqualsGetHashCode方法。 默認情況下,對象使用引用比較來確定相等性。 通過重寫這些方法,我們可以使用自己的邏輯來確定兩個Dvds是否相等。

在下面的示例中,我使用的是TitleReleaseYearDirector字段,但您可以根據需要添加其他字段。 我還實現了IEquatable<Dvd>因為它非常簡單(只需要添加一個帶有Dvd類型對象的Equals方法),並且它與object.Equals實現很順利:

public class Dvd : IEquatable<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; }

    public bool Equals(Dvd other)
    {
        return other != null &&
               Title == other.Title &&
               ReleaseYear == other.ReleaseYear &&
               Director == other.Director;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Dvd);
    }

    public override int GetHashCode()
    {
        return ((Title?.GetHashCode() ?? 17) * 17 +
                ReleaseYear.GetHashCode()) * 17 +
               (Director?.GetHashCode() ?? 17);
    }
}

有了這些變化,我們不必擔心在Linq查詢中評估兩個Dvd對象時需要記住哪些字段需要比較(如果我們想要添加更多屬性進行比較,我們只需在一個地方進行比較而不是在我們的代碼中搜索),我們可以做像if (firstDvd.Equals(secondDvd)) { // do something if they're equal }

現在我們可以使用原始代碼中定義的Contains方法。 例如:

private static void Main()
{
    var repo = new DvdRepository();
    repo.Create(new Dvd("Batman", 2010, "Bruce", 2));
}

輸出到控制台: "duplicate"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM