根据许多参数筛选列表,并将结果收集到另一个列表中

时间:2013-08-01 18:29:12

标签: c# linq list

我有一个对象列表。对象具有以下属性:

public string mCardColor { get; set; }

public string mCardType { get; set; }

public string mCardRarity { get; set; }

在我看来,我可以使用下拉列表直接过滤通过搜索引擎获得的列表。

然后我将过滤器的值传递给控制器​​方法,并检查请求是否是这样的实际Ajax请求:

public ActionResult DisplayCardsResults(string _rarity = "", string _type = "", string _color = "")
{
    ViewBag._rarity = _rarity;
    ViewBag._color = _color;
    ViewBag._type = _type;

    if (Request.IsAjaxRequest())
    {
        mListCardColors = null;
        mListCardType = null;
        mListCardRarity = null;

        if (_rarity != "All")
        {
            mListCardRarity = mListCards.Where(_item => _item.mMasterCard.mCardRarity == _rarity).ToList();
        }
        if (_type != "All")
        {
            mListCardType =
                mListCards.Where(_item => _item.mMasterCard.mCardType.ToLower().Contains(_type.ToLower())).ToList();
        }
        if (_color != "All")
        {
            mListCardColors = mListCards.Where(_item => _item.mMasterCard.mCardColor == _color).ToList();
        }

        if (mListCardType == null && mListCardColors == null && mListCardRarity == null)
        {
            return PartialView("_ResultsTable", mListCards.ToPagedList(pageNumber, ValueDomain.PAGE_SIZE));
        }

        mListCardsToShow = new List<CardDisplay>();

        if (mListCardType != null)
        {
            mListCardsToShow.AddRange(mListCardType);
        }
        if (mListCardRarity != null)
        {
            mListCardsToShow.AddRange(mListCardRarity);
        }
        if(mListCardColors != null)
        {
            mListCardsToShow.AddRange(mListCardColors);
        }

        return PartialView("_ResultsTable", mListCardsToShow.ToPagedList(pageNumber, ValueDomain.PAGE_SIZE));
    }

    if (mListCardsToShow.Count > 0)
    {
        mListCardsToShow = SortListOrder(_sortOrder, mListCardsToShow);
        return View(mListCardsToShow.ToPagedList(pageNumber, ValueDomain.PAGE_SIZE));
    }

    if (mListCards.Count > 0)
    {
        mListCards = SortListOrder(_sortOrder, mListCards);
    }

    return View(mListCards.ToPagedList(pageNumber, ValueDomain.PAGE_SIZE));
}

您有2个列表:mListCards是从搜索引擎获取的卡列表。这不需要改变。仅当请求是Ajax请求时才使用mListCardsToShow

我想根据传递给控制器​​方法的过滤器仅保留所需的值。原则如下:如果三个下拉列表全部显示,则显示所有卡。但是,如果任何或所有下拉列表中都有值,则需要过滤实际列表。

是否有一种有效的方法可以使用Linq基于三个参数过滤列表,而不是编写9个不同的场景?

1 个答案:

答案 0 :(得分:1)

如果你没有强烈的理由不这样做,那么同时过滤三个领域可能是有意义的:

var filteredCards =
    from card in mListCards
    where _color == "ALL" || card.mCardColor == _color
    where _type == "ALL" || card.mCardType == _type
    where _rarity == "ALL" || card.mCardRarity == _rarity
    select card;