C#调用lambda和orderby中对象的函数

时间:2016-06-15 19:00:15

标签: c# .net linq lambda

我试图在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方法,所以对布尔值进行验证是行不通的。

感谢您的所有意见。

亲切的问候。

3 个答案:

答案 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
});