在C#中使用Lambda返回key =>值对的数组

时间:2017-01-25 08:26:06

标签: c# .net linq lambda

我有以下Lambda表达式,它返回一个结果属性数组:

ViewBag.Items = db.Items.Select(m => new { m.Id, m.Column1, m.Column2 }).ToArray();

这可以按预期工作,但我需要将结果作为key =>值对,其中Id是Column1&的关键字。 Column2是值。我找到了关于如何创建Dictionary的示例,但没有找到仅在结果中隔离特定列的示例。

ViewBag.Items在视图中使用:

在jQuery中进行了本地化
var _items = @Html.Raw(Json.Encode(ViewBag.Items));

如何更改上面的Lambda以生成一组key =>值对?

2 个答案:

答案 0 :(得分:8)

您可以使用ToDictionary执行此操作:

db.Items.Select(m => new { m.Id, m.Column1, m.Column2 })
        .ToDictionary(x=>x.Id, x=>new {x.Column1, x.Column2});

如果您希望将Id作为值来考虑HimBromBeere的良好解决方案,那么DictionaryId为关键,{Column1, Column2}为值。

答案 1 :(得分:6)

问题出在哪里?

ViewBag.Items = db.Items.Select(m => new KeyValuePair<string, MyType>
    ( 
        m.Id, 
        new MyType { Column1 = m.Column1, Column2 = m.Column2 }
    )).ToArray();

但无论如何Dictionary只是KeyValuePair的列表,为什么不使用呢?

ViewBag.Items = db.Items.ToDictionary(
        m => m.Id, 
        m => new MyType { Column1 = m.Column1, Column2 = m.Column2 });

当然您也可以使用Dictionary<anonymous, anonymous>

ViewBag.Items = db.Items.ToDictionary(
        m => m.Id, 
        m=> new { m.Column1, m.Column2 } );

但是当你将它分配给一个视图时,我怀疑你可以在这里使用匿名类型。

Dictionary数组上使用KeyValuePair的优点是还会检查重复的键。如果你想避免这种情况,请改用ToLookup来代替重复键。