c# - List.Contains 在迭代 foreach 循环时不起作用

标签 c# list foreach contains

我有一个 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/

相关文章:

java - 在 foreach 循环中使用最终变量如何工作

javascript - 在 knockout.js 中嵌套 foreach

c# - 为什么在 tempData 中添加很多项目时 tempData 总是 null?

c# - 在unity3D中,点击=触摸?

c# - 如何从 List<Tuple<DateTime, string>> 中删除项目

java - 在java中编译链接列表代码时的警告

java - 在 Java 列表中查找连续整数组

php - PHP 在 Foreach 循环中是否有 "built-in"迭代器?

c# - 在 ASP.NET 中从 SQL Server 读取 XML 文件

c# - 部分 View 忽略数据集且不显示