我试图在lambda表达式中调用对象的方法,然后对列表进行排序。是否可以在一个表达式中执行此操作?
这就是我现在所拥有的,它有效:
// FindItemsResults<Item> is of namespace Microsoft.Exchange.WebServices.Data.FindItemsResults<Item>
FindItemsResults<Item> findResults = service.FindItems(
WellKnownFolderName.Inbox,
view
);
foreach (Item myItem in findResults.Items.Where(o => LoadObject(o) == true).OrderByDescending(o => o.DateTimeCreated))
{
// Do that stuff again...
}
private static bool LoadObject(Item o)
{
o.Load();
return true;
}
我想知道的是,如果有一种方法可以在不调用LoadObject的情况下执行此操作,则可以在lambda表达式中执行o.Load。它是一个Void方法,所以对布尔值进行验证是行不通的。
感谢您的所有意见。
亲切的问候。
答案 0 :(得分:0)
是的,你可以这样做。
例如,您可以创建扩展方法:
public static class Extensions
{
public static IEnumerable<Item> Load(this IEnumerable<Item> items)
{
foreach(var item in items)
{
item.Load()
yield return item;
}
}
}
然后将其称为:
foreach (var item in findResults.Items.Load().OrderByDescending(o => o.DateTimeCreated))
{
// Do some stuff...
}
但我会说你可以在循环中调用Load
方法。
答案 1 :(得分:0)
Where
扩展方法需要一个返回布尔值的委托。您无法提供VOID。 Yacoub Massad的评论是正确的,LINQ查询表达式不应该对底层数据产生副作用。如果您想删除foreach循环,因为您认为它创建了更清晰的代码,那么您可以使用List(of T).ForEach
对每个项目执行操作,然后在下一行查询并订购您的项目。例如:
findResults.Items.ToList().ForEach(o => o.Load(o));
foreach (var item in FindResults.Items.OrderByDescending(o => o.DateTimeCreated))
{
// Do stuff
}
答案 2 :(得分:0)
从纯函数编程的角度来看,它并不总是被认为是好的做法,但我定义了以下两种扩展方法:
public static void ForEach<T>(
this IEnumerable<T> pEnumerable,
Action<T> pAction
) {
foreach (var item in pEnumerable)
pAction(item);
}
public static IEnumerable<T> ForEachWithContinue<T>(
this IEnumerable<T> pEnumerable,
Action<T> pAction
) {
pEnumerable.ForEach(pAction);
return pEnumerable;
}
然后您可以执行以下操作:
findResults
.Items
.ForEachWithContinue(o => o.Load())
.OrderByDescending(o => o.DateTimeCreated)
.ForEach(o => {
// do more stuff
});