返回记录的方法为true false或all

时间:2018-05-08 13:36:23

标签: c# linq methods

有没有更好的方法来编写下面的方法?我想根据bool变量IsPublished返回内容。

IsPublishednull时,我想要返回同时为truefalse的条目。

public IList<Content> GetContent(bool? IsPublished)
{
    if (IsPublished != null)
    {
        return _UoW.Content.All.Where(c => c.IsPublished == IsPublished).ToList();
    }
    else
    {
        return _UoW.Content.All.ToList();
    }
}

4 个答案:

答案 0 :(得分:0)

如果更好,则意味着更短,运营商?可以成为解决方案。此外,isPublished == null时使用过滤器毫无意义。有关?运营商的信息,请参阅Microsoft文档here

public IList<Content> GetContent(bool? IsPublished)
{
    return isPublished != null ? _UoW.Content.All.Where(c=>c.IsPublished== IsPublished).ToList() : _UoW.Content.All.ToList();
}

答案 1 :(得分:0)

效率不高,但 紧凑:

public IList<Content> GetContent(bool? IsPublished)
    => _UoW.Content.All.Where(c => !IsPublished.HasValue || c.IsPublished == IsPublished).ToList();

答案 2 :(得分:0)


您可以使用null coalesce operator ??并过滤x.IsPublished == (v ?? x.IsPublished)

public class A
{
    public int Id { get; set; }
    public Nullable<bool> IsPublished { get; set; }
}

public static IEnumerable<A> Filter(IEnumerable<A> items, Nullable<bool> v)
{
    return items.Where(x => x.IsPublished == (v ?? x.IsPublished)).ToList();
}

var listy = new List<A>();
listy.Add(new A() { Id=1, IsPublished=null });
listy.Add(new A() { Id=2, IsPublished=true });
listy.Add(new A() { Id=3, IsPublished=false });
listy.Add(new A() { Id=4, IsPublished=null });
listy.Add(new A() { Id=5, IsPublished=true });
listy.Add(new A() { Id=6, IsPublished=false });

C#交互式控制台演示:

> Filter(listy, null)
List<Submission#0.A>(6) { Submission#0.A { Id=1, IsPublished=null }, Submission#0.A { Id=2, IsPublished=true }, Submission#0.A { Id=3, IsPublished=false }, Submission#0.A { Id=4, IsPublished=null }, Submission#0.A { Id=5, IsPublished=true }, Submission#0.A { Id=6, IsPublished=false } }
> Filter(listy, true)
List<Submission#0.A>(2) { Submission#0.A { Id=2, IsPublished=true }, Submission#0.A { Id=5, IsPublished=true } }
> Filter(listy, false)
List<Submission#0.A>(2) { Submission#0.A { Id=3, IsPublished=false }, Submission#0.A { Id=6, IsPublished=false } }  

(上述课程为A而不是Content,方法为Filter,而不是GetContent

答案 3 :(得分:0)

如果您想要简短,那么对于单个声明{ }正文,您不需要if else个阻止。

但也许你正在寻找一个回归点:

public IList<Content> GetContent(bool? IsPublished) {
    var ans = _UoW.Content.All;
    if (IsPublished.HasValue)
        ans = ans.Where(c => c.IsPublished == IsPublished);

    return ans.ToList();
}

(假设All的类型与Where的返回类型兼容。如果不是,您可以将分配更改为var ans = _UoW.Content.All.Where(c => true)。)