4

我对使用 linq 表达式并尝试重构一些旧代码相当陌生。有没有办法将下面的方法变成一个简短而干净的 Linq 表达式?

public int GetParentCount(object o)
{ 
    int count = 0;
    object parent = GetParentObject(o);
    while (parent != null)
    {
        count++;
        parent = GetParentObject(parent);
    }
    return count;
}

我试过搜索但没有得到满意的结果

4

3 回答 3

2

您可以像这样枚举祖先:

public IEnumerable<MyClass> AncestorsOf(MyClass obj)
{
   var parent = GetParentObject(obj);
   if (parent != null)
   { 
       yield return parent;
       foreach(var grandparent in AncestorsOf(parent))
          yield return grandparent;
   }
}

获得总数将是一个简单的AncestorsOf(obj).Count()

于 2013-04-05T15:02:08.393 回答
1

作为安德解决方案的替代方案,一种非递归方法:

using System;
using System.Linq;
using System.Collections.Generic;

namespace Demo
{
    static class Program
    {
        static void Main()
        {
            var obj = new object();
            int count = AllParents(obj).Count(); // Using Linq only here.
            Console.WriteLine(count);
        }

        public static IEnumerable<object> AllParents(object obj)
        {
            while (true)
            {
                obj = GetParentObject(obj);

                if (obj == null)
                    yield break;

                yield return obj;
            }
        }

        // This is merely a hacky test implementation.
        public static object GetParentObject(object obj)
        {
            if (--count == 0)
                return null;

            return obj;
        }

        private static int count = 10;
    }
}
于 2013-04-05T15:12:15.993 回答
0

这是一个通用函数,可以处理任何类型的对象,任何对象名称都包含父对象(使用Func<T,T>):

public static class MyExtensions {

  /// <summary>Gets an enumerable of all ancestors.</summary>
  public static IEnumerable<T> Ancestors<T>(this T obj, Func<T, T> expr) where T : class {
    obj = expr.Invoke(obj);
    while(obj != null) {
      yield return obj;
      obj = expr.Invoke(obj);
  }
}

下面是一个使用该函数的示例应用程序:

class MyClass {
    public MyClass Parent { get; set; }
}

void Main()
{
    MyClass a = new MyClass();
    a.Parent = new MyClass();
    a.Parent.Parent = new MyClass();

    a.Ancestors(myObj => myObj.Parent).Count(); // Result: 2
}
于 2015-03-31T19:48:46.180 回答