gpt4 book ai didi

c# - 将 for 循环转换为 linq 查询

转载 作者:太空宇宙 更新时间:2023-11-03 17:54:28 24 4
gpt4 key购买 nike

我认为自己非常擅长 LINQ,但有时我会尝试完成一些我无法开始工作的事情。我想将 SPListItemCollection 转换为字典,这样我就可以使用键查找值,而无需每次都进行 LINQ 查询:

var formsConfigItems = new Dictionary<string, string>();
foreach (SPListItem item in list.GetItems(query))
formsConfigItems.Add(item.Title, (item["Value"] == null ? string.Empty : item["Value"].ToString()));

这行得通,但我希望使用 LINQ 以更简洁的方式进行。 (没什么大不了的,但我喜欢尽可能使用 LINQ 而不是 for 循环,尽管在幕后是一样的。

我试着做这样的事情:

var formsConfigItems = (from SPListItem i in list.GetItems(query)
select new { i.Title, i["Value"].ToString() }).ToDictionary<string, string>(k=>k.Key, k=>k.Value);

但这似乎行不通。如果我尝试在 list.GetItems(query) 上使用 lambda 表达式,我无法选择使用 .Where 或任何 LINQ 命令(这很奇怪,因为它是一个 SPListCollection)

提前致谢。

最佳答案

尝试:

var formsConfigItems = list.GetItems(query)
.Cast<SPListItem>()
.ToDictionary(item => item.Title,
item => Convert.ToString(item["Value"]));

回答您的问题:

If I try to use a lambda expression on list.GetItems(query), I'm not given the option to use .Where or any linq commands (which is weird because it is an SPListCollection)

那是因为 SPListCollection 是实现 IEnumerable 的“老式”集合但不是 IEnumerable<T> ,因此 C#/LINQ(无论如何在编译时)无法判断它包含的项目的类型Cast<SPListItem>()调用有助于解决此问题 - 它变成了 IEnumerable进入 IEnumerable<T> ,允许类型代数在编译时计算。你的for loop 没有这个问题,因为您明确指定了循环变量的类型 - 编译器代表您为序列中的每个项目插入一个强制转换。

I tried to do something like this (query expression). But that doesn't seem to work.

那是因为你没有正确构造匿名类型实例(无法为任意表达式推断属性名称)并且你的 lambda 表达式也不完全正确(你使用的属性名称与匿名类型)。试试这个:

var formsConfigItems = (from SPListItem i in list.GetItems(query)
select new
{
i.Title,
Value = Convert.ToString(i["Value"])
}).ToDictionary(a => a.Title, a => a.Value);

关于c# - 将 for 循环转换为 linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15296792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com