c# - 如何使用 C# 检查一个对象(我必须在列表中插入)是否已经在列表中?
问题描述
我不太喜欢C#和.NET。我有以下问题。
在我的代码中,我有这样的东西:
UOR uor;
foreach (int idUor in visibilitaPostRidistribuzioni)
{
uor = UorSQL.GetUorFromId(siglaAOO, idUor, dbConfig);
visibUtils.Uors.Add(uor);
}
其中visibUtils.Uors是UOR对象的列表。
正如你所看到的,我正在迭代一个 ID 列表(visibilitaPostRidistribuzioni)。对于每个 ID,我都在检索一个UOR uor对象,并将其添加到visibUtils.Uors列表中。
我需要的是一种聪明的方法来检查这个uor对象是否存在于visibUtils.Uors列表中,然后再插入它以避免重复。
如果这两个字段的值相同,则 2 个 UOR 对象是同一个对象:SiglaAOO和SiglaUOR
UOR对象是这样的模型类:
public class UOR
{
private string unitaOperativaResponsabile;
public string UnitaOperativaResponsabile
{
get { return unitaOperativaResponsabile; }
set { unitaOperativaResponsabile = value; }
}
private string areaOrganizzativaOmogenea;
public string AreaOrganizzativaOmogenea
{
get { return areaOrganizzativaOmogenea; }
set { areaOrganizzativaOmogenea = value; }
}
private string siglaAOO;
public string SiglaAOO
{
get { return siglaAOO; }
set { siglaAOO = value; }
}
private string siglaUOR;
public string SiglaUOR
{
get { return siglaUOR; }
set { siglaUOR = value; }
}
private int idUor;
public int IdUor
{
get { return idUor; }
set { idUor = value; }
}
private bool attiva;
public bool Attiva
{
get
{
return attiva;
}
set
{
attiva = value;
}
}
private int alias;
public int Alias
{
get
{
return alias;
}
set
{
alias = value;
}
}
public override int GetHashCode()
{
// Get the hash code for the Textual field if it is not null.
int hashTextual = siglaAOO == null ? 0 : siglaAOO.GetHashCode();
// Get the hash code for the Digital field.
int hashDigital = idUor.GetHashCode();
// Calculate the hash code for the object.
return hashDigital ^ hashTextual;
}
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
UOR p = obj as UOR;
if ((System.Object)p == null)
{
return false;
}
// Return true if the fields match:
return (idUor == p.idUor) && (siglaAOO.Equals(p.siglaAOO));
}
public bool Equals(UOR p)
{
// If parameter is null return false:
if ((object)p == null)
{
return false;
}
// Return true if the fields match:
return (idUor == p.idUor) && (siglaAOO.Equals(p.siglaAOO));
}
}
我知道我可以在visibUtils.Uors列表上进行迭代,并检查此列表中是否存在具有相同SiglaAOO和SiglaUOR字段值的对象(如果我必须插入当前对象)。
但是......存在一些更聪明的方法吗?(可能与 lambda 表达式有关)
解决方案
正如您已经定义的那样GetHashCode
,Equals
最好使用HashSet<UOR>
而不是List<UOR>
. 因为HashSet
将检查是否存在O(1)
复杂性,而List
- 与O(n)
.
var interimSet = new HashSet<UOR>();
foreach (int idUor in visibilitaPostRidistribuzioni)
{
var uor = UorSQL.GetUorFromId(siglaAOO, idUor, dbConfig);
interimSet.Add(uor); //which is the same as: if(!interimSet.Contains(uor))interimSet.Add(uor);
}
visibUtils.Uors = interimSet.ToList();
推荐阅读
- haskell - 理解haskell中的类型级函数
- python - Discord.py user.block/user.send_friend_request:错误 403/Forbidden 如何授予机器人发送好友请求和阻止用户的权限?
- c# - 在OpenGL中查找旋转矩阵
- java - Spring Sleuth - JMS ErrorHandler 上的跟踪中断
- c++ - 为什么用户无法提供他们的输入
- python - Python将带有argumnets的函数保存到变量而不调用函数
- reactjs - ComponentDidMount 在一个屏幕上工作,但在另一个屏幕上不起作用 - React-Native
- c++ - 如何为 C++ 构建 32 位的 Assimp 库?
- excel - 在 Excel 中为 SpinButton 分配键盘快捷键
- c# - Xamarin 表单 - ListView 选择问题