查找包含hashset中所有值的值

时间:2017-04-24 16:27:16

标签: c# asp.net-mvc linq

我有一个表单,它向控制器发送一个参数列表。对于我的其他查询,我发送表单数据:

public ActionResult Index(string[] category)

将每个打开到一个hashset:

if ((category != null) && (category.Count() > 0))
{
    foreach (var item in category)
    {
        categoryHashset.Add(item);
    }
}

我用过

categoryHashset.Contains(object.Category)

在where语句中键入设置。这对我的大多数查询都很有用,因为大多数表都有一个类别映射到一个组。因此,一个组可能会多次出现在表中,但可以链接到许多类别。所以我会这样做:

var groupCount = studyGroup
.GroupBy(s => s.ID)
.Select(g => new { ID = g.Key, Count = g.Count() });

foreach (var checkCount in groupCount) //check or filter as well
{
    if (checkCount.Count == category.Count())
    {
        otherHashset.Add(checkCount.ID.ToString());
    }
}

但是,在这种特定情况下,每个类别都在表中的一列中,由管道(|)分隔。如果用户检查多个类别,我只想撤回列中包含所有这些类别的组。换句话说,如果我检查“猫”和“狗”,它应该只会退回:

Group    Category
Star     cat|dog|bird
Night    cat|bird
Sky      cat|dog

上表示例中的星空。

我如何处理管道并获得正确的结果?

1 个答案:

答案 0 :(得分:0)

您可以在分组前过滤studyGroups以仅获取其类别(按“|”拆分的类别)包含所有categoryHashSet的内容,如下所示:

var groupCount = studyGroup
.Where(group => 
       categoryHashset.All(c => group.Category.Contains("|" + c + "|") 
                                ||
                                group.Category.StartsWith(c + "|")
                                ||
                                group.Category.EndsWith("|" + c)
                                ||
                                group.Category.Equals(c))
.GroupBy(s => s.ID)
.Select(g => new { ID = g.Key, Count = g.Count() });

请注意,您不能使用group.Category.Split(),因为linq不支持实体,即使在这种情况下似乎更合乎逻辑。