我有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>();
答案 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));