过滤对象列表

时间:2014-11-29 17:29:01

标签: c#

我有一个对象产品

的列表
public Class Product 
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Status { get; set; }
}

我有一份上述产品清单:

List<Product> p ;

我正在尝试根据搜索条件ID, Title, Status.

过滤此列表
Example :
Id Title  Status
1  ABC   OPEN
2  CDE   CLOSED
3  FGH   RESOLVED
4  IJK   PROPOSED
5  LMN   SET
6  OPQ   CLOSED
7  MNO   OPEN
8  STU   CLOSED.

如果输入了搜索字段 ID 1 :它应该返回

1  ABC   OPEN

如果输入搜索字段状态OPEN :应返回

1  ABC   OPEN
7  MNO   OPEN

如果输入搜索字段标题“MNO”状态“打开”,则应返回:      7 MNO OPEN

如果 Id =“” Title =“” Status =“ALL”,则应返回所有元素。

我将把这个对象列表绑定到一个asp.net网格视图。

到目前为止,我的代码如下:

var results = new List<Product>();

foreach (var prod in Product)
{
    if (prod.ID == txtProd)
    {
        results.Add(prod);
    }
    if (prod.Title.ToUpper() == txtTitle)
    {
        results.Add(prod);
    }
    if (prod.Status.ToUpper() == strStatus)
    {
        results.Add(prod);
    }
}

您能否告诉我如何修改此代码以实现我的结果?

5 个答案:

答案 0 :(得分:2)

基本上你想在你的条件之间使用AND,你当前正在做的是OR,并且当它满足多个条件时你会两次添加相同的项目。

您可以根据参数构建动态linq查询:

var query = Product.AsQueryable();
query = txtProd != string.Empty ?  query.Where(x => x.ID == txtProd) : query;
query = txtTitle != string.Empty ? query.Where(x => x.Title == txtTitle) : query;
query = strStatus != string.Empty ? query.Where(x => x.Status == strStatus) : query;

var results = query.ToList();

答案 1 :(得分:0)

试试这个:

results = p.Where(((product.ID < yourIDLowerBound) || (product.ID == yourID)) 
                  && (string.IsNullOrEmpty(product.yourTitle) || product.Title == yourTitle) 
                  && (string.IsNullOrEmpty(product.yourStatus) || product.Status == yourStatus)).ToList();

答案 2 :(得分:0)

作为单个Linq查询,它看起来像这样:

var results = p.Where(x => 
     (string.IsNullOrEmpty(txtProd) || x.ID == Convert.ToInt32(txtProd))
         && (string.IsNullOrEmpty(txtTitle) || x.Title == txtTitle) 
         && (string.IsNullOrEmpty(strStatus) || x.Status == strStatus)).ToList();

顺便说一下,在列表results属于Task类型的问题中,您尝试添加Products,这是不可能的。

答案 3 :(得分:0)

    var results = new List < Product > ();
    if (strStatus == "ALL" || txtProd == "" || txtTitle == "")
        results = p;
    else
        foreach(var prod in p) {
            if (prod.ID == Int32.Parse(txtProd)) {
                results.Add(prod);
            }
            if (prod.Title.ToUpper() == txtTitle) {
                results.Add(prod);
            }
            if (prod.Status.ToUpper() == strStatus) {
                results.Add(prod);
            }
        }
    results = results.Distinct()
        .ToList();

答案 4 :(得分:0)

如何创建产品查询方法。我认为这符合所有要求,我不认为任何其他要求涵盖了所有要求。要求。

    public List<Product> ProductQuery(List<Product> Products
        , int? IDCriteria
        , string TitleCriteria
        , string StatusCriteria)
    {
        var query = Products.AsQueryable();

        if (IDCriteria != null)
        {
            query.Where(x => x.ID == IDCriteria);
        }

        if (!String.IsNullOrEmpty(TitleCriteria))
        {
            query.Where(x => x.Title == TitleCriteria);
        }

        if (!String.IsNullOrEmpty(StatusCriteria))
        {
            if (StatusCriteria.Equals("all", StringComparison.CurrentCultureIgnoreCase))
            {
                query.Where(x => x.Status.Length > 0 || String.IsNullOrEmpty(x.Status)); //will return any status
            }
            else
            {
                query.Where(x => x.Status == StatusCriteria);
            }
        }

        return query.ToList();
    }