使用Lambda在C#中返回键值对数组

4
我有以下Lambda表达式,它返回一个结果属性数组:
ViewBag.Items = db.Items.Select(m => new { m.Id, m.Column1, m.Column2 }).ToArray();

这个代码可以正常工作,但我需要结果是一个键值对,其中ID是键,Column1和Column2是值。我已经找到了如何创建字典的示例,但没有只隔离结果中特定列的方法。
在视图中,ViewBag.Items被本地化为jQuery。
var _items = @Html.Raw(Json.Encode(ViewBag.Items));

我该如何修改上面的Lambda表达式,以便生成一个键值对数组?

2个回答

8
你可以使用 ToDictionary 来完成这个操作:
db.Items.Select(m => new { m.Id, m.Column1, m.Column2 })
        .ToDictionary(x=>x.Id, x=>new {x.Column1, x.Column2});

这将为您提供一个Dictionary,其中Id是键,{Column1, Column2}是值,如果您希望将Id作为值考虑HimBromBeere的良好解决方案。


3
我认为可以跳过.Select() - Eric
3
如果db.Items是数据库表,那么Select只会检索所需字段,而直接调用ToDictionary将会检索整个记录。因此,如果这不是针对LINQ to Objects(看起来并不是),最好不要跳过Select步骤。 - Ivan Stoev
@IvanStoev 这是一个很好的发现,我已经在LINQPad中尝试确认了,谢谢! - Eric

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,它将允许重复键。


不使用字典的原因是因为你会失去延迟执行的特性。例如,如果你只想要前三个元素,或者只想要满足特定条件的唯一一个元素,那么使用带有Select的Linq语句会在满足你的请求后立即停止执行。而使用字典的语句会先将所有元素放入字典中,然后再执行你的请求。如果你只想要FirstOrDefault(),这样做就浪费了时间。 - Harald Coppoolse
2
@HaraldCoppoolse 当调用 ToArray 时,您还会失去延迟执行,因此这并不相关。 - MakePeaceGreatAgain
最后,没有一个帖子回答了如何创建 KeyValuePair<IdType, AnonymousType>数组,而不使用Dictionary。为什么不使用它?因为出于某种原因你需要数组。为什么不使用ToDictionary(...).ToArray()? 因为如果你所需要的是数组,那么ToDictionary就显得冗余和低效。总之,看到“你可以这样做”,“你可以那样做”,但如果我是OP,没有人告诉我如何做我想要的事情 :) - Ivan Stoev
1
@IvanStoev,请查看我的第一个回答。它不涉及匿名,但很明显OP也无法在视图中直接使用。基本上,OP所询问的是没有意义的,为什么你要一个“KeyValuePair”的数组呢?你可以从中构建一个字典或查找表,我无法想象还有其他有效的情况,因此答案只涉及这些有效的情况。 - MakePeaceGreatAgain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接