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

时间:2016-10-24 17:10:01

标签: c#

这应该很容易,但是我没有理解为什么我的所有方法都不起作用。

我查看了所有解决方案并适当地使用了它们但是没有得到结果。

解决方案包括

Solution 1

Solution 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;
}

有人能看到我的错误吗?

2 个答案:

答案 0 :(得分:3)

当您使用// private MainMenuScene mainMenuScene; // instance = this; 时,您需要定义&#34;等于&#34;表示Except类型,否则默认使用引用相等(它们是相同的对象)。在你的循环中,你定义&#34;等于&#34; as&#34; feature s相等&#34;,所以有些选项是:

  • 覆盖Id课程中的EqualsGetHashCode
    • 这成为&#34;默认&#34;类型的等义定义
  • 定义实现feature的类
    • 只有在需要该定义时才能使用
  • 使用IEqualityComparer<feature>代替Where

    Except
    • 性能不是最佳的,但如果整体性能不会受到显着影响,则它是一种更简单的代码解决方案。

答案 1 :(得分:0)

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

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