2017-01-18 126 views
-1

我试图从.csv文件建立层次结构,它由ID(功能位置)的,说明&父ID(SupFunctLoc)这些都是字符串。我已将数据提取到列表中。 代码&数据参考样本。递归亲子关系C#

Functional Loc. Description SupFunctLoc. 
70003 ABC AS002 
70C2 ABC 70003 
70C2.01 ABC 70C2 
70C2.01.02 ABC 70C2.01 
70C2.01.02.10 ABC 70C2.01.02 
70C2.01.02.10-BG010 ABC 70C2.01.02.10 

示例代码:

static void Main(string[] args) 
    { 
     List<Input> inputList = new List<Input>(); 
     var yourData = File.ReadAllLines(locate) 
       .Skip(1) 
       .Select(x => x.Split(',')) 
       .Select(x => new Input() 
       { 
        FunctionalLocation = x[0], 
        Description = x[1], 
        SuppFunctionalLocation = x[2], 

       }); 
     //try 3 

     //try 2 

     var outputList = yourData 
      .Where(i => i.SuppFunctionalLocation!= null) // Just get the parents 
      .Select(i => new Input() 
      { 
       Description = i.Description, 
       SuppFunctionalLocation = i.SuppFunctionalLocation, 
       Children = inputList 
        .Where(x => x.FunctionalLocation.ToString() == i.SuppFunctionalLocation.ToString()) 
        .Select(x => new Input() 
        { 
         Description = x.Description, 
         SuppFunctionalLocation = x.SuppFunctionalLocation, 
         FunctionalLocation = x.FunctionalLocation, 
        }).ToList() 
       }).ToList(); 


     foreach (var output in outputList) 
     { 
      Console.WriteLine(output.Description); 
      output.Children.ForEach(c => Console.WriteLine($"\t {c.Description}")); 
     } 
} 

类认定中输入

class Input 
    { 
     public string FunctionalLocation { get; set; } 
     public string Description { get; set; } 
     public string SuppFunctionalLocation { get; set; } 
     public List<Input> Children { get; set; } 
    } 

请帮什么可以在这种情况下进行。感谢您的帮助。

+3

你正在分裂一个''',但你的示例文本没有逗号。另外,你需要为'Input'提供类def。 – Enigmativity

+0

@Enigmativity你好我已粘贴的数据的样品,并用输入级认定中 – user5928466

+0

更新问题'功能Loc.'是主键? – nozzleman

回答

0

试试这个:

var source = @"Functional Loc. Description SupFunctLoc. 
70003 ABC AS002 
70C2 ABC 70003 
70C2.01 ABC 70C2 
70C2.01.02 ABC 70C2.01 
70C2.01.02.10 ABC 70C2.01.02 
70C2.01.02.10-BG010 ABC 70C2.01.02.10"; 

var lines = 
    source 
     .Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
     .Select(x => x.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); 

var results = 
    lines 
     .Skip(1) 
     .Select(x => new Input() 
     { 
      FunctionalLocation = x[0], 
      Description = x[1], 
      SuppFunctionalLocation = x[2], 
     }); 

var lookup = results.ToLookup(x => x.SuppFunctionalLocation); 

Func<string, List<Input>> build = null; 
build = SuppFunctionalLocation => 
    lookup[SuppFunctionalLocation] 
     .Select(x => new Input() 
     { 
      FunctionalLocation = x.FunctionalLocation, 
      Description = x.Description, 
      SuppFunctionalLocation = x.SuppFunctionalLocation, 
      Children = build(x.FunctionalLocation), 
     }) 
     .ToList(); 

List<Input> tree = build("AS002"); 
+0

谢谢你的帮助:) – user5928466

0

从现有父关键是相对容易的项目建设层次。我从你的示例中抽象出一些,但它基本上是一样的。

该项目拟投入层次

public class MyItem 
{ 
    public string Id { get; set; } 
    public string Description { get; set; } 
    public string ParentId { get; set; } 
    // to be filled 
    public IList<MyItem> Children { get; set; } 
} 

的代码来构建子表。

// assumption: MyItem elements have all properties set except the children collection 
ICollection<MyItem> items = GetMyItems(); 

var parentRelation = items.ToLookup(x => x.ParentId); 
foreach (var item in items) 
{ 
    item.Children = parentRelation[item.Id].ToList(); 
} 
+0

非常感谢...... :) – user5928466

1

一旦您已经阅读所有的物品放入收集建立与

foreach (var parent in inputlist) 
{ 
    parent.Children = inputlist 
     .Where(child => child.SuppFunctionalLocation == parent.FunctionalLocation) 
     .ToList(); 
} 

父关系,只得到你必须寻找所有的根元素项目,有没有父

var outputlist = inputlist 
    .Where(child => !inputlist.Any(parent => parent.FunctionalLocation == child.SuppFunctionalLocation)) 
    .ToList();