1

我有 2 个列表,其中包含一些数据:

List1.Add(new Filter { Name = "Foo", Value = "Bar" });
List2.Add(new Filter { Name = "Foo", Value = "Bar" });

List1如果包含 中的所有值,我想使用 Linq 返回 true List2,上面的示例显然会返回 true,但这是一个示例,但如果我添加

List2.Add(new Filter { Name = "Foo1", Value = "Bar1" });

那么它应该返回false。

我开始往下走:

var Result = from item1 in List1
             join item2 in List2 on item1.Name equals item2.Name
             new { item1, item2 };

但这只会在名称上匹配,我很确定我走错了路。

编辑:只是为了澄清,我不只想要 VALUE 属性。名称和值必须在两个列表中匹配。

4

3 回答 3

4

您可以使用Except

var l1Vals = List1.Select(f => f.Value);
var l2Vals = List2.Select(f => f.Value);
var notInL1 = l2Vals.Except(l1Vals);
if(notInL1.Any())
{
    // no, not all Values of List2 are in List1
}

编辑根据您要比较的所有属性的最后编辑,Filter最好的方法是创建一个自定义IEqualityComparer<Filter>并将其用作此Enumerable.Except重载的参数:

public class Filter {
    public String Name { get; set; }
    public String Value { get; set; }

    public class Comparer : IEqualityComparer<Filter>
    {
        public bool Equals(Filter x, Filter y)
        {
           if(ReferenceEquals(x, y))
               return true;
           else if(x==null || y==null)
               return false;
           return x.Name  == y.Name
               && x.Value == y.Value;
        }

        public int GetHashCode(Filter obj)
        {
            unchecked 
            {
                int hash = 17;
                hash = hash * 23 + obj.Name.GetHashCode();
                hash = hash * 23 + obj.Value.GetHashCode();
                return hash;
            }
        }
    }
}

现在这有效:

var notInL1 = List2.Except(List1, new Filter.Comparer());
if (notInL1.Any())
{
    // no, not all properties of all objects in List2 are same in List1
    // notInL1 contains the set difference
}
于 2012-11-20T10:00:18.787 回答
0

你可以试试:

bool areAllElementsInList2 = list1.All(i => list2.Contains(i));

Contains-Methode 使用 Equals-Methode 指定项目是否在该列表中。所以你应该重写Filter-Class的Equals-Methode。

或者你试试:

bool areAllElementsInList2 = list1.All(i1 => list2.Any(i2 => i1.Name == i2.Name && i1.Value == i2.Value));

HTH 托比

于 2012-11-20T10:00:36.727 回答
0
bool list1doesNotContainAllFromList2 = list2.Except(list1).Any();

请注意,如果您需要使用集合 - 比较等,最好使用HashSet<>集合而不是List<>- 它具有类似ExceptWithUnionWith比标准 LINQ 运算符执行得更快的方法。

于 2012-11-20T10:01:03.230 回答