【发布时间】:2017-02-13 11:30:55
【问题描述】:
我有两个 IEnumerable 对象,如果满足特定条件,我需要将每个元素从第一个 IEnumerable 带到第二个 IEnumerable。我的代码是这样的
IEnumerable<IPublishedContent> nodesTemp = posts.Take(10).ToList();
IEnumerable<IPublishedContent> nodes = null;
foreach (var n in nodesTemp)
{
if (condition=true)
{
nodes.add(n);
}
}
但这会引发错误
:“System.Collections.Generic.IEnumerable
”不包含“add”的定义,也没有接受“System.Collections.Generic”类型的第一个参数的扩展方法“add” .IEnumerable ' 可以找到(您是否缺少 using 指令或程序集引用?) 完整代码供参考
IEnumerable<IPublishedContent> nodesTemp = posts.Take(count).ToList();
IEnumerable<IPublishedContent> nodes = null;
foreach (IPublishedContent n in nodesTemp)
{
var rolename = n.GetProperty("focusedUserGroup").Value.ToString();
var username = umbraco.cms.businesslogic.member.Member.GetCurrentMember().Text;
var flag = false;
if (!string.IsNullOrEmpty(rolename))
{
var groups = rolename.Split(',');
foreach (var group in groups)
{
if (Roles.IsUserInRole(username, group))
{
nodes.add(n);
break;
}
}
}
}
【问题讨论】:
-
你不能添加
IEnumerable它是只读的。采取List -
@Div 你能建议任何解决方法,以便我可以将一些特定项目从一个 IEnumerable 转移到另一个?
-
可以是几千行代码。但你总是可以把它放在功能上。然后在查询中使用它。
-
没有区别 - 您可以将谓词重构为任意数量的函数。最终,所有“条件”都需要是
Func<IPublishedContent, bool> -
Div 的评论可能是对的。如果在循环之前将
nodes声明为var nodes = new List<IPublishedContent>();而不是= null,则可以将.Add(大写A)声明为List<>。这样的List<>实现了IEnumerable<>(而后者的接口甚至是协变的)。