我有一个 FilterItems 列表(称为过滤器)。每个 FilterItem 由一个字符串和一个 bool 值组成。例如“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 循环再次迭代时不会。
最佳答案
“问题在于,即使 myItem 与列表中已有的项目相同,Contained 的结果也始终为 false” 事实上并非如此 - 您总是实例化新对象,而 .Contains 方法仅比较引用。 此处最好的方法是检查列表中是否已存在具有相同属性集的项目:
!filter.Any(item => item.Name == myItem.Namae && item.Checked == myItem.Checked);
应该可以解决问题,因为您比较的不是项目的引用,而是项目的实际属性。
关于c# - List.Contains 在迭代 foreach 循环时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39701782/