【问题标题】:How to convert this sample foreach into lambda expression?如何将此示例 foreach 转换为 lambda 表达式?
【发布时间】:2016-02-10 01:14:00
【问题描述】:

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

【问题讨论】:

  • 您为什么要这样做?你想达到什么目的?
  • 您的 foreach 很可能会比等效的 lambda 更快。
  • 由于 for each 中的每个循环都是独立的,我建议使用并行 for 循环并将值转储到并发集合中,然后在最后进行排序。

标签: c# asp.net linq list generics


【解决方案1】:
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

【讨论】:

  • 如果有某种 C# 等价于 F# 的 Seq.choose,那会让它更漂亮一个数量级。
  • @TheInnerLight 好点,特别是结合可能的 TryParseDecimal (这是一个很好的实用方法)。我现在就实现一个选择扩展方法,好主意。
【解决方案2】:

必须尝试在尽可能少的行中执行此操作,有趣的问题,但我不会将您的方法转换为 LINQ,如果它已经有效(什么有效)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多