Linq拆分Class的属性并将其分配给另一个自定义类

时间:2014-01-14 02:13:35

标签: linq

我现在有一个复杂的情况,我非常困难。如果你能分享一些亮点,请告诉我。

我有一个

列出哪些具有以下属性

public class Categories 
    {
        public string DisplayName { get; set; }
        public string ValueCode { get; set; }
        public string Count { get; set; }           
    }

这将具有像

这样的值
Category1/SubCategory1
cat1/sc1
5

Category1/SubCategory2
cat1/sc2
4

Category 2/Subcategory1
cat2/sc1
5

Category 2/Subcategory2
cat2/sc2
23

我创建了一个自定义类来填充值

public class JobCateogry 
    {
        public string DisplayName { get; set; }
        public string ValueCode { get; set; }
        public string Count { get; set; }
        public List<JobCateogry> SubCategories { get; set; }
    }

我必须在代码值中拆分字符串并将其分配给SubCategory。

就像我最后的jobCategory一样

  • Category1
  • CAT1
  • 9
    • 子类别1
    • SUB1
    • 5
    • SubCateogry2
    • SUB2
    • 4

我尝试拆分字符串并首先通过拆分然后通过分配将其分配给新类。但我确信我的做法是错误的,因为在我分手的那一刻,我放松了计数。

var lstCategory =  Categories 
                        .Where(i => i.count > 0)
                        .Select(item => item.valueCode.Split('/')                                        
                        .Select(k =>(k)).ToList();

List<JobCategories> jobcategories = lstCategory
    .Select(item => item.Split(QueryStringConstants.CAT_SEPERATOR.ToCharArray()[0]))
    .GroupBy(tokens => tokens[0].Trim(), tokens => tokens[1])
    .Select(g => new JobCategories(g.Key,  g.DisplayName,g.ToList(),)).ToList();

你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

有点奇怪的任务

它可能不是最好的解决方案,它只适用于两层:-),我试着保留很多linq以获得它的乐趣

无论如何希望它能让你前进。

完整代码段https://gist.github.com/cbpetersen/db698def9a04ebb2abbc

    static void Main(string[] args)
    {
        var cats = new[] 
        {
            new Categories { Count = "5", ValueCode = "cat1/sc1", DisplayName = "Category1/SubCategory1" },
            new Categories { Count = "4", ValueCode = "cat1/sc2", DisplayName = "Category1/SubCategory2" },
            new Categories { Count = "5", ValueCode = "cat2/sc1", DisplayName = "Category2/Subcategory1" },
            new Categories { Count = "23", ValueCode = "cat2/sc2", DisplayName = "Category2/Subcategory2" }
        };

        var categories = cats.Select(x => x.DisplayName.Split('/')[0]).Distinct();

        var list = new List<JobCateogries>();
        foreach (var category in categories)
        {
            var a = new JobCateogries
            {
                ValueCode = cats.Where(x => x.DisplayName.Split('/')[0] == category)
                                .Select(x => x.ValueCode.Split('/')[0]).FirstOrDefault(),
                DisplayName = category,
                SubCategories = cats.Where(x => x.DisplayName.Split('/')[0] == category)
                                    .Select(x => new JobCateogries
                                    {
                                        SubCategories = new List<JobCateogries>(), 
                                        Count = x.Count, 
                                        DisplayName = x.DisplayName.Split('/')[1], 
                                        ValueCode = x.ValueCode.Split('/')[1]
                                    }).ToList(),
            };

            a.Count = a.SubCategories.Select(x => int.Parse(x.Count)).Sum().ToString();
            list.Add(a);
        }
        list.ForEach(x => Print(x));

        Console.ReadKey();

    }
    public static void Print(JobCateogries category, int indent = 0)
    {
        var prefix = string.Empty.PadLeft(indent);
        Console.WriteLine(prefix + category.DisplayName);
        Console.WriteLine(prefix + category.ValueCode);
        Console.WriteLine(prefix + category.Count);
        category.SubCategories.ForEach(x => Print(x, indent + 4));
    }