Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Except方法比较列表_C# - Fatal编程技术网

C# 使用Except方法比较列表

C# 使用Except方法比较列表,c#,C#,我想比较两个列表。我试图使用Except方法来获取列表之间不同行的列表。然而,似乎什么也没有发生。我看不到名为missingAuto的值,在即时窗口中,它告诉我missingAuto列表在当前上下文中不存在 代码的底部有我的IEqualityComparer实现 for(int i = 0; i < _fundCodes.Count; i++) { _hldListAuto = db.CheckHoldings(dtUpload, "HOLDINGS

我想比较两个列表。我试图使用Except方法来获取列表之间不同行的列表。然而,似乎什么也没有发生。我看不到名为missingAuto的值,在即时窗口中,它告诉我missingAuto列表在当前上下文中不存在

代码的底部有我的IEqualityComparer实现

for(int i = 0; i < _fundCodes.Count; i++)
        {
            _hldListAuto = db.CheckHoldings(dtUpload, "HOLDINGS", _fundCodes[i]);
            _hldListMan = db.CheckHoldings(dtUpload, "HOLDINGS_LIVE", _fundCodes[i]);

            // search through mannual list first
            List<Holding> missingAuto = _hldListMan.Except(_hldListAuto, new Holding.Comparer()).ToList();
            List<Holding> missingMan = _hldListAuto.Except(_hldListMan, new Holding.Comparer()).ToList();
        }


class StockDetail
{
    public string IdSearch { get; set; }
    public string IdSedol { get; set; }
    public double Price { get; set; }
    public string Name { get; set; }
}

class Holding : StockDetail
{        
    public string FundCode { get; set; }
    public string Currency { get; set; }
    public double Nominal { get; set; }

    public class Comparer : IEqualityComparer<Holding>
    {
        public bool Equals(Holding x, Holding y)
        {
            return x.FundCode == y.FundCode && x.IdSedol == y.IdSedol && x.Nominal == y.Nominal && x.Currency == y.Currency;
        }

        public int GetHashCode(Holding obj)
        {
            int hash = 17;
            hash = hash * 23 + (obj.FundCode ?? "").GetHashCode();
            hash = hash * 23 + (obj.IdSedol ?? "").GetHashCode();
            hash = hash * 23 + (obj.Nominal).GetHashCode();
            hash = hash * 23 + (obj.Currency ?? "").GetHashCode();
            return hash;
        }
    }
}
for(int i=0;i<\u fundCodes.Count;i++)
{
_hldListAuto=db.CheckHoldings(dtUpload,“HOLDINGS”,基金代码[i]);
_hldListMan=db.CheckHoldings(dtUpload,“HOLDINGS_LIVE”、_fundcode[i]);
//首先搜索手动列表
List missingAuto=\u hldListMan.Except(\u hldListAuto,new Holding.Comparer()).ToList();
List missingMan=hldListAuto.Exception(hldListMan,new Holding.Comparer()).ToList();
}
类详细信息
{
公共字符串IdSearch{get;set;}
公共字符串IdSedol{get;set;}
公共双价{get;set;}
公共字符串名称{get;set;}
}
持有类别:股票详情
{        
公共字符串FundCode{get;set;}
公共字符串货币{get;set;}
公共双标称{get;set;}
公共类比较器:IEqualityComparer
{
公共布尔等于(保留x,保留y)
{
返回x.FundCode==y.FundCode&&x.IdSedol==y.IdSedol&&x.Nominal==y.Nominal&&x.Currency==y.Currency;
}
公共int GetHashCode(持有obj)
{
int hash=17;
hash=hash*23+(obj.FundCode???).GetHashCode();
hash=hash*23+(obj.IdSedol???).GetHashCode();
hash=hash*23+(obj.Nominal).GetHashCode();
hash=hash*23+(obj.Currency???).GetHashCode();
返回散列;
}
}
}

对我有用。以下代码:

List<Holding> _hldListAuto = new List<Holding> {
    new Holding { FundCode = "ASDF" },
    new Holding { FundCode = "QWER" },
};
List<Holding> _hldListMan = new List<Holding> {
    new Holding { FundCode = "QWER" },
    new Holding { FundCode = "ZXCV" },
};
List<Holding> missingAuto = _hldListMan.Except(_hldListAuto, new Holding.Comparer()).ToList();
List<Holding> missingMan = _hldListAuto.Except(_hldListMan, new Holding.Comparer()).ToList();
foreach (var holding in missingAuto)
    Console.WriteLine("Missing Auto " + holding.FundCode);
foreach (var holding in missingMan)
    Console.WriteLine("Missing Man " + holding.FundCode);

您在调试时描述的行为听起来像是为发布模式构建的,并且一些变量被优化掉了。当您计划进行调试时,您应该为调试进行构建,以便按照您期望的方式工作。

为什么不简单地重写
Equals(Object)
GetHashCode()
?您从哪里得到该错误?@SLaks抱歉,我不明白。我没有得到一个错误,但当我在代码中单步执行时,我去检查'misigauto'的值,但我无法检查它的值。因此,我尝试在即时窗口中执行一个简单的missingAuto.Count&这就是我得到当前上下文消息的地方,在代码中的什么时候您尝试过?该变量仅存在于循环中。是否处于释放模式?