【问题标题】:LINQ Get Grouped ID by conditionLINQ 按条件获取分组 ID
【发布时间】:2013-05-03 07:25:39
【问题描述】:

您好,我有一个列表:

1 A2 一个 3 4 乙 1 乙二 C 1

我想选择至少包含这 3 个数字的字母:1,2,3

所以在这种情况下会选择字母 A。

你能帮我把它写成 LINQ 表达式吗?

非常感谢!

【问题讨论】:

    标签: linq group-by contains


    【解决方案1】:

    首先,收集你需要的数字。

    var required = new[] { 1, 2, 3 };
    

    然后,按字母分组。

    var groupedPairings = pairings.GroupBy(p => Letter, p => Number);
    

    然后,丢弃那些没有您的三个必需项目的配对。 (这里的逻辑是“收集需要的项目,删除组中的任何内容,并确保没有任何剩余”。)

    var groupsWithRequired = groupedPairings
        .Where(g => !required.Except(g).Any());
    

    现在,如果你只想要字母,你可以简单地做

    var lettersWithRequired = groupsWithRequired.Select(g => g.Key);
    

    或者如果你想要一个从字母到数字集合的字典映射,你可以这样做

    var dictionary = groupsWithRequired.ToDictionary(g => g.Key, g => g.ToArray());
    var numbersForA = dictionary["A"]; // = {1, 2, 3, 4}
    

    【讨论】:

      【解决方案2】:

      你可以试试这个,虽然我觉得这不是最好的答案:

      var items = new List<Item>{ 
          new Item{Name="A", Value=1},
          new Item{Name="A", Value=2},
          new Item{Name="A", Value=3},
          new Item{Name="A", Value=3},
          new Item{Name="A", Value=4},
          new Item{Name="B", Value=1},
          new Item{Name="B", Value=2},
          new Item{Name="C", Value=1},
      };
      
      var values = new List<int>{1,2,3};
      
      var query = items.GroupBy (i => i.Name)
                       .Where (i => i.Select (x => x.Value)
                                     .Intersect(values).Count() == values.Count)
                       .Select (i => i.Key);
      

      在哪里

      class Item{
          public string Name{get;set;}
          public int Value{get;set;}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 2021-12-31
        相关资源
        最近更新 更多