我们有一个MyObject类型的对象,它有几个可能的布尔值,我们称之为Foo,Bar和Meh。
我有一个相同类型的其他对象的列表,我只希望选择那些与原始对象具有匹配的Foo / Bar / Meh值的对象。这样做的一种方法是这样的:
#{form @UneReponses.modifier(unereponse.id), method:'PUT', id:'creationForm'}
哪个好,但看起来有点混乱。
在现实世界中,我有类似的情况,除了我处理其中9个布尔属性并且有几个实例,其中类似于上面的逻辑需要存在于外部if / else语句中。
这将是近乎无法辨认的。是否有更简洁/更简单的方式处理这样的结构?
答案 0 :(得分:3)
您可以在Where()
:
myObjects = existingMyObjects.Where(o => o.Foo == MyObject.Foo
&& o.Bar == MyObject.Bar
&& o.Meh == MyObject.Meh).ToList();
您还可以在Equals()
类型上覆盖MyObject
:
public class MyObject
{
public bool Foo { get; set; }
public bool Bar { get; set; }
public bool Meh { get; set; }
public MyObject()
{
}
public override bool Equals(object obj)
{
var item = obj as MyObject;
if (item == null)
{
return false;
}
return (item.Foo == this.Foo && item.Bar == this.Bar && item.Meh == this.Meh);
}
public override int GetHashCode()
{
return new { Foo, Bar, Meh }.GetHashCode();
}
}
然后你可以这样做:
var filtered = myObjects.Where(o => obj.Equals(o)).ToList();
虽然你的问题缺乏明确性。您是否希望所有对象与您所声明的原始对象相同,或者您希望所有对象Foo/Bar/Meh
都是true
,如您的代码所示?
答案 1 :(得分:0)
你可以将它们全部合并到一个linq语句中,但是它的代码行数肯定更少,我不确定它是不是一团糟!
List<MyObject> myObjects = existingMyObjects.Where(o =>
(MyObject.Foo && o.Foo == true) ||
(MyObject.Bar && o.Bar ) ||
(MyObject.Meh && o.Meh == true)).ToList();