如何将此示例foreach转换为lambda表达式?

时间:2015-11-09 11:40:37

标签: c# asp.net linq list generics

如何将此示例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)]
}

2 个答案:

答案 0 :(得分: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的其他原因。

答案 1 :(得分:0)

不得不尝试尽可能少的行,有趣的问题,我不会将你的方法转换为LINQ,如果它已经有效(什么有效)

lDimensionValues = pMemberCollection.Where(a => {
           decimal lDimensionValued;
           return decimal.TryParse(a.Name, out lDimensionValued);
       }).Select(a=> decimal.Parse(a.Name)).Sort();