从一个列表中删除在另一个列表中找到的元素

本文关键字:列表 另一个 元素 删除 一个 | 更新日期: 2023-09-27 18:14:45

这应该很容易,但是我没能看到为什么我所有的方法都不工作。

我已经看过所有的解决方案,并适当地使用它们,但我没有得到结果。

解决方案包括

解决方案1

解决方案2

代码如下:

IEnumerable<feature> available = _repo.GetAvailableFeatures();
IEnumerable<feature> selected = _repo.GetSelectedFeatures();
使用除

var filteredList = (available.Except(selected)).ToList;
使用Linq

var availableList = available.ToList();
var selectedList = selected.ToList();
availableList.RemoveAll(item => selectedList.Contains(item));

for (var i = 0; i < availableList.Count - 1; i++)
        {
            foreach (var t in selectedList)
            {
                if (availableList[i].Id == t.Id)
                {
                    availableList.RemoveAt(i);
                }
            }
        }

我的Feature类看起来像这样:

public class Feature
{
 public int Id;
 public int Desc;
}

有人能看出我的错误吗?

从一个列表中删除在另一个列表中找到的元素

当您使用Except时,您需要定义feature类型的"equal"意味着什么,否则默认使用引用相等(它们是相同的对象吗)。在你的循环中,你将"equal"定义为" Id s are equal",所以一些选项是:

  • 覆盖feature类中的EqualsGetHashCode
    • 这成为了类型
    • 的"默认"相等定义。
  • 定义一个实现IEqualityComparer<feature>的类
    • 只有在需要该定义时才能使用
  • 使用Where代替Except:

    var filteredList = available.Where(a => !selected.Any(s => s.Id == a.Id))
                                .ToList();
    
    • 性能是次优的,但如果总体性能没有显著影响,这是一个更简单的代码解决方案。

这看起来是一个比较两个数据列表并以标准方式删除它们的简单过程。我个人会使用List设置而不是IEnumerable。

List<Feature> availableList = _repo.GetAvailableFeatures();
List<Feature> selectedList = _repo.GetSelectedFeatures();
foreach(Feature avail in availableList){
    if(selectedList.Contains(avail)){
        selectedList.Remove(avail)
    }