比较两个结构List,并查找list#的项目是否出现在C#中的list2的项目中

问题描述

我有两个记录结构和两个列表,如下所示:

 public struct gtAliasRecType : ICloneable
    {
        public int lRecordNum; 
        public double dLocationCd; 
    }

   public struct gtCVARecType : ICloneable
    {
        public double dLocationCd; 
    }

    static public List<gtCVARecType> LCVARec = null; 
    static public List<gtAliasRecType> LAliasRec = null;

现在我要遍历“ LAliasRec”列表,并查找“ LCVARec”列表中是否存在类似的“ dLocationCd”。

我尝试使用列表1的“包含”和“查找”功能,但最终出现错误

 public static void XYZ()
    {
        gtAliasRecType uAliasRec = gtAliasRecType.CreateInstance();
        gtCVARecType uCVARec = gtCVARecType.CreateInstance();
        
        for (int i = 0; i < LAliasRec.Count; i++)
        {
           uAliasRec = LAliasRec[i];               

            //trying Find method 
            gtCVARecType c1  = LCVARec.Find(uAliasRec.dLocationCd);

            //trying Contains method 
            bool nReturn = LCVARec.Contains( uAliasRec.dLocationCd );
            
        }
    }

但是,我遇到了“无法从'double'转换为'gtCVARecType'错误

Contains & Find

预先感谢:)

解决方法

您不能使用Contains查找其他类型的项目。您可以使用Find,但我个人将使用LINQ Any方法:

foreach (var uAliasRec in LAliasRec)
{
    bool nReturn = LCVARec.Any(rec => rec.dLocationCd == uAliasRec.dLocationCd);
    // Presumably do something with nReturn
}

如果列表很大,您可能想先为所有位置创建一个HashSet<double>,这是一项前期成本,会使其他所有产品更便宜:

HashSet<double> locations = new HashSet<double>(LCVARec.Select(rec => rec.dLocationCd));
foreach (var uAliasRec in LAliasRec)
{
    bool nReturn = locations.Contains(uAliasRec.dLocationCd);
    // Presumably do something with nReturn
}

顺便说一句,我强烈建议您开始遵循常规的.NET命名约定。按照目前的格式,对于那些习惯使用常规C#代码的人来说,您的代码将非常困难。

,

您可以使用LINQ和Inner join查找两个列表的交集。

var query = from lcva in LCVARec
            join lAlias in LAliasRec on lcva.dLocationCd equals lAlias.dLocationCd
            select lcva;

Console.WriteLine(query.Count()); //prints number of matching items.

更新

如果您可以将List<T>的{​​{1}}更改为SortedList<TKey,TValue>,将有助于更快地查找。

如果您更喜欢使用SortedDictionary<TKey,TValue>,则必须实现Contains();如果要提高性能,则必须IEquatable<T>,这需要该类具有Sort(),然后执行{{ 1}}

参考:https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=netcore-3.1#remarks

,

使用Intersect

 var results = LAliasRec
     .Select(x => x.dLocationCd)
     .Intersect(LCVARec.Select(x => x.dLocationCd));
 bool exists = results.Count() > 0;

Select仅使用双精度值,并得到相交的值。如果Count 大于0 ,则表示您具有共同的属性值。