如果对象列表中不存在对象字段,是否更新?

时间:2018-09-12 20:21:55

标签: c# .net

我有2个看起来像这样的对象列表:

public class Object1
{
    public string Value1 {get; set;}
    public string Value2 {get; set;}
    public bool Exclude {get; set;}
}

第二个包含我要用来从第一个对象中排除值的值。

public class Object2
{
    public string Value1 {get; set;}
    public string Value2 {get; set;}

}

如果Value1和Value2都不同时匹配Object2中的两个属性,我该如何编写将Exclude的值设置为true的东西?

List<Object1> object1 = new List<Object1>();
List<Object2> object2 = new List<Object2>();

4 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

if(!listOfObject2.Any(x => x.Value1 == object1.Value1 
                        && x.Value2 == object1.Value2)
)
{
    object1.Exclude = true;
}

在以上代码段中,listOfObject2的类型为List<Object2>object1的类型为Object1

答案 1 :(得分:0)

如果您要执行的操作是将第一个列表中的对象标记为排除对象,因为第二个列表中没有与Value1和Value2属性匹配的对象,则可以尝试ForEach

object1.ForEach(o1 => o1.Exclude = !object2.Any(o2 => o2.Value1 == o1.Value1 && o2.Value2 == o1.Value2));

答案 2 :(得分:0)

如果您有两个列表,则应该可以:

foreach (var obj1 in object1)
{
    obj1.Exclude = true;
    foreach (var obj2 in object2)
    {
        if (obj1.Value1.Equals(obj2.Value1)
            || obj1.Value1.Equals(obj2.Value2)
            || obj1.Value2.Equals(obj2.Value1)
            || obj1.Value2.Equals(obj2.Value2))
        {
            obj1.Exclude = false;
            break;
        }
    }
}

这会将Exclude初始化为true,然后循环访问Object1列表,并将其两个值与object2列表中每个Object2的两个值进行比较。如果找到匹配项,则将exclude设置为false并中断内部循环,因为它不再需要查找。如果一切顺利,Exclude仍然正确。

答案 3 :(得分:0)

执行此操作的另一种方法是在Object1类上实现比较方法,该方法接受Object2并在属性匹配时返回true

public class Object1
{
    public string Value1 { get; set; }
    public string Value2 { get; set; }
    public bool Exclude { get; set; }

    public bool ValuesMatch(Object2 other)
    {
        return (other != null) &&
               Value1 == other.Value1 &&
               Value2 == other.Value2;
    }
}

然后,您可以在Linq语句中使用此方法:

object1.ForEach(o1 => o1.Exclude = object2.Any(o1.ValuesMatch));