2015-11-09 41 views
1

如何將此示例foreach轉換爲lambda表達式?如何將此示例foreach轉換爲lambda表達式?

foreach (ADOMD.Member iMember in pMemberCollection) 
        { 
         decimal lDimensionValue = 0; 
         if (Decimal.TryParse(iMember.Name, out lDimensionValue)) 
          lDimensionValues.Add(lDimensionValue);      
        } 
        lDimensionValues.Sort(); 

ADOMD.Member是界面看起來像

[TypeLibType(xxx)] 
[Guid("xxxxx")] 
public interface Member 
{ 
    [DispId(0)] 
    string Caption { get; } 
    [DispId(1610743817)] 
    int ChildCount { get; }   
    string Name { get; } 
    [DispId(1610743812)] 
    Member Parent { get; } 
    [DispId(1610743819)] 
    bool ParentSameAsPrev { get; } 
    [DispId(1610743815)] 
} 
+6

爲什麼你想要?你想達到什麼目的? – nvoigt

+1

你的foreach很可能會比等效的lambda更快。 –

+0

由於each中的每個循環都是獨立的,我建議使用parallel for循環並將值轉儲到併發集合中,然後在最後進行排序。 –

回答

0

不得不嘗試做到這一點作爲幾行地,有趣的問題,我也不會你的方法轉換爲LINQ不過,如果它已經工作的(什麼作品作品)

lDimensionValues = pMemberCollection.Where(a => { 
      decimal lDimensionValued; 
      return decimal.TryParse(a.Name, out lDimensionValued); 
     }).Select(a=> decimal.Parse(a.Name)).Sort(); 
4
lDimensionValues = 
pMemberCollection 
.Cast<ADOMD.Member>() 
.Select(iMember => { 
    decimal lDimensionValue = 0; 
    if (Decimal.TryParse(iMember.Name, out lDimensionValue)) 
     return (decimal?)lDimensionValue; 
    else return null; 
    }) 
.Where(x => x != null) 
.Select(x => x.Value) 
.OrderBy(x => x) 
.ToList(); 

很醜陋和冗長。如果我們有一個TryParseDecimal方法,它會更乾淨。

這不是LINQ的完美案例。原因之一是顯然需要Cast的傳統集合。

+0

如果只有某種類型的C#等價於F#的'Seq.choose',那麼這會使這個數量級更漂亮。 – TheInnerLight

+0

@TheInnerLight的好處,特別是結合可能的TryParseDecimal(這是一個很好的實用方法)。我現在將實施選擇擴展方法,這是個好主意。 – usr

+0

thnx usr其工作正常。 –

相關問題