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

C# 如何将此示例foreach转换为lambda表达式?,c#,asp.net,linq,list,generics,C#,Asp.net,Linq,List,Generics,如何将此示例foreach转换为lambda表达式 foreach (ADOMD.Member iMember in pMemberCollection) { decimal lDimensionValue = 0; if (Decimal.TryParse(iMember.Name, out lDimensionValue))

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

 foreach (ADOMD.Member iMember in pMemberCollection)
                    {
                        decimal lDimensionValue = 0;
                        if (Decimal.TryParse(iMember.Name, out lDimensionValue))
                            lDimensionValues.Add(lDimensionValue);                     
                    }
                   lDimensionValues.Sort();  
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)]
}

我必须尽可能少地用几行代码来实现这一点,这是一个有趣的问题,但我不会将您的方法转换为LINQ,如果它已经可以工作的话(什么可以工作)


我必须尽可能少地用几行代码来实现这一点,这是一个有趣的问题,但我不会将您的方法转换为LINQ,如果它已经可以工作的话(什么可以工作)

lDimensionValue=
pMemberCollection
.Cast()
.选择(iMember=>{
十进制lDimensionValue=0;
if(Decimal.TryParse(iMember.Name,out-lDimensionValue))
返回(十进制?)L尺寸值;
否则返回null;
})
.其中(x=>x!=null)
.选择(x=>x.Value)
.OrderBy(x=>x)
.ToList();
非常难看和冗长。如果我们有一个
TryParseDecimal
方法,它会更干净

对于LINQ来说,这不是一个完美的例子。由于遗留集合的其他原因,显然需要进行
Cast

lDimensionValues=
pMemberCollection
.Cast()
.选择(iMember=>{
十进制lDimensionValue=0;
if(Decimal.TryParse(iMember.Name,out-lDimensionValue))
返回(十进制?)L尺寸值;
否则返回null;
})
.其中(x=>x!=null)
.选择(x=>x.Value)
.OrderBy(x=>x)
.ToList();
非常难看和冗长。如果我们有一个
TryParseDecimal
方法,它会更干净


对于LINQ来说,这不是一个完美的例子。由于遗留集合的其他原因,显然需要进行
转换。

您为什么要这样做?您试图实现什么?您的foreach很可能比等效的lambda快。由于for-each中的每个循环都是独立的,我建议使用并行for循环,将值转储到并发集合中,然后在最后进行排序。您为什么要这样做?你想实现什么?你的foreach很可能比等价的lambda快。因为for-each中的每个循环都是独立的,我建议使用并行for循环,将值转储到并发集合中,然后在最后排序。如果有某种C#等价于F#s
Seq。选择
,这将使它更漂亮一个数量级。@TheInnerLight的优点,特别是结合了可能的TryParseDecimal(这是一个很好的util方法)。我现在将实现一个Choose扩展方法,好主意。如果有某种C#等价于F#的
Seq。Choose
,这将使它更漂亮一个数量级。@Theinerlight的优点,特别是与可能的TryParseDecimal相结合(这是一个很好的实用方法)。我现在就实现一个Choose扩展方法,好主意。
lDimensionValues = pMemberCollection.Where(a => {
           decimal lDimensionValued;
           return decimal.TryParse(a.Name, out lDimensionValued);
       }).Select(a=> decimal.Parse(a.Name)).Sort();
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();