C# 自参考LINQ

C# 自参考LINQ,c#,linq,C#,Linq,给定以下c代码: public class Class1 { public static void Main() { var tasks = new[] { new Task {id = 1, name = "Task 1", dependencyId = 0}, new Task {id = 2, name = "Task 2", dependencyId = 1}, ne

给定以下c代码:

public class Class1
{
    public static void Main()
    {

        var tasks = new[]
        {
            new Task {id = 1, name = "Task 1", dependencyId = 0},
            new Task {id = 2, name = "Task 2", dependencyId = 1},
            new Task {id = 3, name = "Task 3", dependencyId = 2},
            new Task {id = 4, name = "Task 4", dependencyId = 3},
            new Task {id = 5, name = "Task 5", dependencyId = 0},
        };

        var listOfTasks = (from t in tasks
                 join dt in tasks
                     on t.id equals dt.dependencyId into JoinedTasks
                 from jt in JoinedTasks
                 select new TaskWithDependency
                    {
                        Task = jt,
                        DependentTask = t
                    }).ToList();

        foreach (var z in listOfTasks)
        {
            Console.WriteLine(z.Task.name + " depends on: " + (z.DependentTask != null ? z.DependentTask.name : ""));
        }
        Console.ReadKey();

    }
}

public class TaskWithDependency
{
    public Task Task { get; set; }
    public Task DependentTask { get; set; }
}

public class Task
{
    public int id { get; set; }
    public string name { get; set; }
    public int dependencyId { get; set; }
}

如何使用LINQ投射到IEnumerable中。我正在有效地尝试实现自联接。结果应该是IEnumerable,在此示例中,只有第一个TaskWithDependency具有依赖关系

这可能就是你想要的:

var tasksTransformed = tasks.Select(x => new TaskWithDependency
{
    Task = x,
    DependentTask = tasks.Where(y => y.DependencyId == x.id)
}
IEnumerable<TaskWithDependency> tasksWithDep = tasks.Select(t => new TaskWithDependency() { Task = t, DependentTask = tasks.Where(dt => dt.dependencyId == t.id) });

期望的结果是什么?这一点还不清楚。如果结果应该是IEnumerable,则必须支持通过其dependencyId查找具有Dependency的Task。或者,从某个根返回IEnumerable很简单。是哪一个?我已经编辑了我的原始问题。TaskWithDependency类中的DependentTask应为Task类型,而不是IEnumerable类型。我还添加了我目前得到的LINQ表达式。这几乎是正确的,理想情况下,它将返回所有剩余的join任务,不管它们是否有依赖任务。您可能还希望在两个枚举中调用ToList。还请注意,此算法在^2上,这意味着如果有很多元素,则速度会很慢。下一个层次是做一个GroupBy.ToDictionary,然后从中进行查找,这样就可以了:几乎正确,只需要FirstOrDefault,而不是Where clause。IEnumerable listOfTasks=tasks。选择t=>new TaskWith Dependency{Task=t,DependentTask=tasks.FirstOrDefaultdt=>dt.dependencyId==t.id};为我辩护,在你最初的问题中,依赖任务是一个枚举:。小心使用FirstOrDefault,它不会处理存在多个匹配项的情况。