[英]How can I check if an object (that I have to insert in a list) is already in the list using 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 對象是同一個對象,如果它們對於這 2 個字段具有相同的值: 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();
將此更改為以下內容:
foreach (int idUor in visibilitaPostRidistribuzioni)
{
var uor = UorSQL.GetUorFromId(siglaAOO, idUor, dbConfig);
if(!visibUtils.Uors.Any(a => a.Equals(uor))
{
visibUtils.Uors.Add(uor);
}
}
UOR uor;
foreach (int idUor in visibilitaPostRidistribuzioni)
{
var uor = UorSQL.GetUorFromId(siglaAOO, idUor, dbConfig);
if(!visibUtils.Uors.FirstOrDefault(a => a == uor)
{
visibUtils.Uors.Add(uor);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.