问题描述
我有两个记录结构和两个列表,如下所示:
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”。
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
,但我个人将使用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}}
使用Intersect
var results = LAliasRec
.Select(x => x.dLocationCd)
.Intersect(LCVARec.Select(x => x.dLocationCd));
bool exists = results.Count() > 0;
Select
仅使用双精度值,并得到相交的值。如果Count
大于0 ,则表示您具有共同的属性值。