【问题标题】:How to create this Linq function?如何创建这个 Linq 函数?
【发布时间】:2023-03-12 19:49:01
【问题描述】:

我有一个这样的对象:

Tuple<Question, Levels[]>

// question, { easy, medium, hard }

Levels 是一个具有四个选项的枚举:Easy、Medium、Hard 和 Expert。

我希望对于每个包含元组的枚举,LINQ 函数提供一个Dictionary&lt;Question, Levels&gt;。例如

如果我的元组有三个级别,那么字典应该有三个值,

// question, Easy
// question, Medium
// question, Hard

【问题讨论】:

  • 所以每个级别的问题都是一样的,它是字典中的关键吗?这将在运行时失败。
  • 尽你所能:Dictionary&lt;Question, Levels[]&gt;
  • 好吧,字典应该是最好的方法,也许是元组而不是字典

标签: c# linq dictionary linq-to-objects


【解决方案1】:

正如其他人所指出的,这个问题不是很清楚。我已经尝试向您展示您可能想要做的各种事情:

var stuff = new Tuple<Question, Levels[]>[] {
      // .... 
    };

var flattened = stuff.SelectMany(tup => 
     tup.Item2.Select(Level => new { tup.Question, Level }));

var grouped = flattened.GroupBy(flat => flat.Level);

// now you can do
var easyOnes = grouped[Levels.Easy];
var mediumOnes = grouped[Levels.Medium];

【讨论】:

    【解决方案2】:

    我怀疑 Dictionary&lt;TKey, TValue&gt; 是否真的是您所追求的,因为这需要唯一的键。

    您可能得到的最接近的可能是使用ToLookup&lt;TKey, TElement&gt; 扩展方法:

    var tuple = new Tuple<Question, Levels[]>(question, 
        new [] { Levels.Easy, Levels.Medium, Levels.Hard});
    
    var questionLevels = tuple.Item2.ToLookup(level => tuple.Item1);
    
    // questionLevels contains:
    // question, Levels.Easy
    // question, Levels.Medium
    // question, Levels.Hard
    

    然后可以使用它来获取问题的所有级别:

    var levels = questionLevels[question];
    // levels contains:
    // Levels.Easy
    // Levels.Medium
    // Levels.Hard
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 2020-03-29
      • 2015-07-21
      • 1970-01-01
      相关资源
      最近更新 更多