我有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>();
您可以尝试以下内容:
if(!listOfObject2.Any(x => x.Value1 == object1.Value1
&& x.Value2 == object1.Value2)
)
{
object1.Exclude = true;
}
在上面的片段中,listOfObject2
是List<Object2>
类型和object1
类型的Object1
。
如果您要查看的是从第一个列表中标记对象以进行排除,因为没有对象与第二个列表中的Value1和Value2属性匹配,您可以尝试使用ForEach
:
object1.ForEach(o1 => o1.Exclude = !object2.Any(o2 => o2.Value1 == o1.Value1 && o2.Value2 == o1.Value2));
如果你有两个列表,这应该工作:
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
保持真实。
另一种方法是在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));