C#如何检查List中是否包含具有相同值的自定义对象

14

我有一个自定义对象(属性必须为字符串):

public class Nemesis
{
    public String Dex_ID;
    public String Value;
}

我有一个函数,它可以创建该对象的新实例,为其添加值,然后将它们添加到这个列表中:

private List<Nemesis> _nemesisList;
public List<Nemesis> NemesisList
{
    get { return _nemesisList; }
    set { _nemesisList = value; }
}

通常,我会使用这个来检查现有的东西:

if (!NemesisList.Contains(nemesis))
{
    NemesisList.Add(nemesis);
}

但是这一次我想检查我的列表中是否已经包含一个与相同的nemesis.Dex_IDnemesis。我该如何做到这一点?


2
如果任何列表元素匹配给定的“IdToCheck”,则“NemesisList.Any(n=>n.Dex_ID==IdToCheck)”将返回true。 - Glorin Oakenfoot
@GlorinOakenfoot 谢谢 :) - Kohnarik
4个回答

21

如果你只想检查ID字段并忽略其他字段,那么你可以这样做:

if(!NemesisList.Any(n=> n.Dex_ID == nemesis.Dex_ID))
否则,如果您想对所有字段执行比较,则可以覆盖 EqualsGetHashCode

参见:正确覆盖Equals()和GetHashCode()的方法


抢先一步了!这就是你会做的,Kohnarik。 - Ben Clarke
2
谢谢,我爱你。不要说出这样的话。 - Kohnarik
额,还有一个问题。如果我现在找到了一个与Dex_ID相同的宿敌,我该如何访问这个宿敌呢?假设“n”是找到的宿敌。例如:...else { n.Dex_ID = n.Dex_ID + nemesis.Dex_ID } - Kohnarik
2
使用 FirstOrDefault,请参阅它的用法:var item = NemesisList.FirstOrDefault(n=> n.Dex_ID == nemesis.Dex_ID);,然后修改您的检查,如下:if(item == null) {//没有找到 } else {//找到了,可以使用 item.Dex_ID 进行处理...} - Habib
我认为在这里使用Single()更加惯用。OrDefault是错误的,因为我们知道该项在列表中,如果不在,我们知道有一个错误,所以我们希望快速失败。但我仍然认为在这里使用字典更好。 - sara

2

使用LINQ:

if (!NemesisList.Any(n => n.Dex_ID == nemesis.Dex_ID)) // ...

或者

if (!NemesisList.Select(n => n.Dex_ID).Contains(nemesis.Dex_ID)) // ...

更好的解决方案可能是创建一个字典。它们是基于某些键值进行快速查找而构建的。
if (!NemesisDict.ContainsKey(nemesis.Dex_ID)) // ...

0

尝试使用以下LINQ:

var exists = NemesisList.Any(n=>n.Dex_Id==id)

0

Linq在这里是你的好朋友:

if (!myList.Any(x => x.Dex_ID == nemesis.Dex_ID)) myList.Add(nemesis)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接