避免在C#中的布尔属性列表上出现混乱的流控制

时间:2015-09-15 15:32:59

标签: c# linq

我们有一个MyObject类型的对象,它有几个可能的布尔值,我们称之为Foo,Bar和Meh。

我有一个相同类型的其他对象的列表,我只希望选择那些与原始对象具有匹配的Foo / Bar / Meh值的对象。这样做的一种方法是这样的:

#{form @UneReponses.modifier(unereponse.id), method:'PUT', id:'creationForm'}

哪个好,但看起来有点混乱。

在现实世界中,我有类似的情况,除了我处理其中9个布尔属性并且有几个实例,其中类似于上面的逻辑需要存在于外部if / else语句中。

这将是近乎无法辨认的。是否有更简洁/更简单的方式处理这样的结构?

2 个答案:

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