2016-06-15 10 views
0

ラムダ式の中のオブジェクトのメソッドを呼び出して、リストを並べようとしています。これを1つの式で行うことは可能ですか?ラムダとorderby内のオブジェクトのC#関数を呼び出す

これは私が今持っているもの、それは動作します:ロードオブジェクトへの呼び出しせずにこれを行う方法がある場合、私は思ったんだけど

// 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; 
} 

何o.Loadを行うことができること、ですラムダ式の内部これはVoidメソッドなので、ブール値に対して検証することはできません。

あなたのご意見ありがとうございます。

大切にしてください。

+6

本当にこれを行うべきではありません。 LINQはデータを照会するためのもので、副作用があってはいけません。私はあなたが通常のループを介して項目をロードして、あなたのクエリを行うことをお勧めします。 –

答えて

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メソッドを呼び出すことができると言うでしょう。

+0

もちろん、拡張メソッドはトリックを行うだろう、ありがとう! ループの中でitem.Loadを呼び出すことができましたが、フィールドをロードする必要があるため、DateTimeで注文することができませんでした。 – Nicklorion

+0

私は参照してください。その後、拡張メソッドが必要なものを行います。あるいは、最初にあなたのアイテムを調べ、 'load'を呼び出す必要があります。 – MaKCbIMKo

+0

ええ、Exchangeがアイテムの結果をアンロードされた結果として提供するのはちょっと面倒です。それがなぜであるかわからない。拡張メソッドは今実装され、魅力のように動作します!ありがとう@MaKCbIMKo – Nicklorion

0

Where拡張メソッドでは、ブール値を返すデリゲートが必要です。あなたはVOIDを供給することはできません。ヤコブマサドは、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 
} 
0

それは常にビューの純粋な関数型プログラミングの観点からはいい習慣はありませんが、私は2つの拡張メソッド従っ定義:

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 
}); 
+0

あなたの入力をありがとう、何とか私はMaKCbIMKoのコメントに答える間にそれを逃した – Nicklorion

関連する問題