【问题标题】:Finding Values that contain all in hashset查找包含所有哈希集中的值
【发布时间】:2017-04-24 16:27:16
【问题描述】:

我有一个向控制器发送参数以获取类别清单的表单。对于我的其他查询,我发送表单数据:

public ActionResult Index(string[] category)

将每个放在一个哈希集中:

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

上表示例中的星星和天空。

如何处理管道并返回正确的结果?

【问题讨论】:

  • 您关于其他类别如何工作的示例似乎不包括categoryHashset 或任何where 条件来过滤groupCount

标签: c# asp.net-mvc linq


【解决方案1】:

您可以在分组之前过滤 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 to entity 不支持它,即使在这种情况下这看起来更合乎逻辑。

【讨论】:

  • 这不起作用。我相信它仍在看(哈希集中的第一项是狗,是包含的狗|猫列),但事实并非如此。
  • @yondaimehokage 看看我的答案的编辑。在示例["dog","cat"] 中,它过滤在Category 中具有字符串"|dog|" 或以字符串"dog|" 开头或以字符串"|dog" 结尾的组,然后对于“cat”也是如此.这不是您在示例中要求的吗?
  • 是的。但正如我所说,它不起作用。我只选择了一个类别进行测试,并且只返回类别为“cat”但没有“cat|dog”的组。
  • @yondaimehokage 不知道为什么。如果我使用["cat"] 搜索,它会返回带有Category 的组:cat|dog|bird, cat|bird, cat|dog。我编辑了答案以获取在其类别中完全具有cat 的组,因此您可能还想检查最新的组。我不确定我错过了什么。
  • 是的,我已经添加了 Equals 部分。不知道为什么它受到如此限制。也许是哈希集被读错了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2016-10-08
  • 2017-04-28
相关资源
最近更新 更多