【发布时间】:2017-02-03 17:38:16
【问题描述】:
我有一个 FilterItems 列表(称为过滤器)。每个 FilterItem 由一个字符串和一个布尔值组成。例如“0”和假。
我已经这样声明了列表:
List<FilterItem> filter = new List<FilterItem>();
然后我将遍历数据表列,目的是将该列中的每个值添加到过滤器中 - 如果一个值出现两次 - 不要将重复条目添加到过滤器列表中。这就是我正在做的:
List<FilterItem> filter = new List<FilterItem>(); //initialise new list
foreach (DataRow row in RawResults.Rows) //For each row in DT
{
FilterItem myItem = new FilterItem { Name = row.ItemArray[i].ToString(), Checked = CheckState.Checked }; //create item
if (!filter.Contains(myItem)) //if item doesn't exist
{
filter.Add(myItem); //add it
}
}
问题在于,即使 myItem 与列表中已有的项目相同, Contains 的结果也始终为 false - 我认为这是因为 foreach 循环 - 但我不明白为什么,因为过滤器 List 是在外部声明的那个循环。我也尝试在 foreach 循环之外声明 myItem ,这使差异为零。
如果我执行以下操作:
List<FilterItem> filter = new List<FilterItem>(); //initialise new list
foreach (DataRow row in RawResults.Rows) //For each row in DT
{
FilterItem myItem = new FilterItem { Name = row.ItemArray[i].ToString(), Checked = CheckState.Checked }; //create item
if (!filter.Contains(myItem)) //if item doesn't exist
{
filter.Add(myItem); //add it
}
FilterItem myItem = new FilterItem { Name = row.ItemArray[i].ToString(), Checked = CheckState.Checked }; //create item
if (!filter.Contains(myItem)) //if item doesn't exist
{
filter.Add(myItem); //add it
}
}
第二次 .Contains 被调用(在 foreach 循环的同一迭代中)它正确地变为 true,而不是在 foreach 循环再次迭代时。
【问题讨论】:
-
显示
FilterItem的代码。我的猜测是它不会覆盖Equals和GetHashCode,这意味着Contains将执行引用相等而不是值相等。