[英]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
类上的Equals
和GetHashCode
方法。 默认情况下,对象使用引用比较来确定相等性。 通过重写这些方法,我们可以使用自己的逻辑来确定两个Dvds是否相等。
在下面的示例中,我使用的是Title
, ReleaseYear
和Director
字段,但您可以根据需要添加其他字段。 我还实现了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.