如何在列表中使用 Linq 搜索分层数据
How to search Hierarchical Data with Linq in list
经销商注册。
我想在列表中填写有关分销商的以下信息
Id
ParentId
Name
对于每个分销商,必须确定分销商是根据谁的推荐在系统中注册的。这可以是任何已经在系统中注册的人——在这种情况下,他们必须从已经注册的经销商列表中选择,或者推荐人信息可以是空白的,这意味着经销商在没有推荐人的情况下在系统中注册。每个经销商最多可推荐三人,系统应确保同一经销商“下”注册的人数不超过三人。此外,所提到的分销商的层级深度应最大为 5 - 也就是说,分销商可以推荐一个人,他也会推荐一个人,等等。最多 5 级。因此,在这样的一组中,总共可以有 1 + 3 + 9 + 27 + 81 = 121 人。系统必须提供对给定级别的控制。
您可以使用递归来查找列表中任何元素的深度,并使用普通的旧计数来查找引荐来源网址的数量。
以下代码是该想法的实现。
void Main()
{
var distributors = new List<Distributor> {
new Distributor { Id = 1, ParentId = 0, Name = "A" },
new Distributor { Id = 7, ParentId = 1, Name = "B" },
new Distributor { Id = 9, ParentId = 7, Name = "C" },
new Distributor { Id = 13, ParentId = 9, Name = "D" },
new Distributor { Id = 28, ParentId = 13, Name = "E" },
};
var valid = IsValidToAdd(distributors, 9);
Console.WriteLine(valid);
}
public bool IsValidToAdd(List<Distributor> distributors, int parentId)
{
var referCount = distributors.Count(d => d.ParentId == parentId);
Console.WriteLine($"refer:{referCount}");
if (referCount == 3)
{
Console.WriteLine("There are already 3 referals for this parent");
return false;
}
var level = GetLevel(distributors, parentId);
Console.WriteLine($"level: {level}");
if (level > 5)
{
Console.WriteLine("There are already 5 levels of referals");
return false;
}
return true;
}
public int GetLevel(List<Distributor> distributors, int parentId)
{
var parent = distributors.FirstOrDefault(d => d.Id == parentId);
if (parent == null)
{
return 1;
}
return 1 + GetLevel(distributors, parent.ParentId);
}
public class Distributor
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}
经销商注册。
我想在列表中填写有关分销商的以下信息
Id
ParentId
Name
对于每个分销商,必须确定分销商是根据谁的推荐在系统中注册的。这可以是任何已经在系统中注册的人——在这种情况下,他们必须从已经注册的经销商列表中选择,或者推荐人信息可以是空白的,这意味着经销商在没有推荐人的情况下在系统中注册。每个经销商最多可推荐三人,系统应确保同一经销商“下”注册的人数不超过三人。此外,所提到的分销商的层级深度应最大为 5 - 也就是说,分销商可以推荐一个人,他也会推荐一个人,等等。最多 5 级。因此,在这样的一组中,总共可以有 1 + 3 + 9 + 27 + 81 = 121 人。系统必须提供对给定级别的控制。
您可以使用递归来查找列表中任何元素的深度,并使用普通的旧计数来查找引荐来源网址的数量。
以下代码是该想法的实现。
void Main()
{
var distributors = new List<Distributor> {
new Distributor { Id = 1, ParentId = 0, Name = "A" },
new Distributor { Id = 7, ParentId = 1, Name = "B" },
new Distributor { Id = 9, ParentId = 7, Name = "C" },
new Distributor { Id = 13, ParentId = 9, Name = "D" },
new Distributor { Id = 28, ParentId = 13, Name = "E" },
};
var valid = IsValidToAdd(distributors, 9);
Console.WriteLine(valid);
}
public bool IsValidToAdd(List<Distributor> distributors, int parentId)
{
var referCount = distributors.Count(d => d.ParentId == parentId);
Console.WriteLine($"refer:{referCount}");
if (referCount == 3)
{
Console.WriteLine("There are already 3 referals for this parent");
return false;
}
var level = GetLevel(distributors, parentId);
Console.WriteLine($"level: {level}");
if (level > 5)
{
Console.WriteLine("There are already 5 levels of referals");
return false;
}
return true;
}
public int GetLevel(List<Distributor> distributors, int parentId)
{
var parent = distributors.FirstOrDefault(d => d.Id == parentId);
if (parent == null)
{
return 1;
}
return 1 + GetLevel(distributors, parent.ParentId);
}
public class Distributor
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}