我有一个FilterItems(称为filter)的列表。每个FilterItem由一个字符串&组成一个布尔值。例如“0”和假。List.Contains在通过foreach循环进行交互时不起作用
我已经宣布了名单,像这样:
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是相同的项目已经在列表中 - 我想,这是怎么一回事,因为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
}
}
的第2次。载有被称为(foreach循环的同一迭代内)它正确变为真,只是没有当foreach循环围绕再次迭代。
显示'FilterItem'的代码。我的猜测是它不会覆盖'Equals'和'GetHashCode',这意味着'Contains'将做引用相等而不是值相等。 – juharr