C# 自参考LINQ
给定以下c代码: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
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,它不会处理存在多个匹配项的情况。