如何创建这个Linq功能?

时间:2012-10-11 22:39:18

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

我有一个像这样的对象:

Tuple<Question, Levels[]>

// question, { easy, medium, hard }

Levels是一个包含四个选项的枚举:Easy,Medium,Hard和Expert。

我希望对于包含元组的每个枚举,LINQ函数提供Dictionary<Question, Levels>。例如

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

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

2 个答案:

答案 0 :(得分:2)

正如其他人所说,问题不是很清楚。我试图向您展示您可能想要做的各种事情:

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];

答案 1 :(得分:0)

我怀疑Dictionary<TKey, TValue>是否真的是你所追求的,因为这需要唯一的密钥。

您最接近的可能是使用ToLookup<TKey, TElement>扩展方法:

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