簡體   English   中英

如何使用 C# 檢查對象(我必須插入到列表中)是否已經在列表中?

[英]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.UorsUOR對象的列表。

如您所見,我正在迭代 ID 列表( visibilitaPostRidistribuzioni )。 對於每個 ID,我正在檢索一個UOR uor對象,並將其添加到visibUtils.Uors列表中。

我需要的是一種聰明的方法來檢查此uor對象是否存在於visibUtils.Uors列表中,然后再插入它以避免重復。

2 UOR 對象是同一個對象,如果它們對於這 2 個字段具有相同的值: SiglaAOOSiglaUOR

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列表上進行迭代,並檢查該列表中是否存在具有相同SiglaAOOSiglaUOR字段值的對象(如果我必須插入當前對象)。

但是......存在一些更聰明的方式嗎? (可能與 lambda 表達式有關)

由於您定義了GetHashCodeEquals ,因此最好使用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.

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