2014-01-14 4 views
0

У меня сейчас сложная ситуация, и я ужасно застрял. Пожалуйста, дайте мне знать, если вы можете поделиться с ним некоторым светом.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; } 
    } 

Мне нужно разделить строку в значении кода и назначить ее подкатегории.

Как мой окончательный из jobCategory будет

  • Категория1
  • Cat1
    • SubCategory1
    • sub1
    • SubCateogry2
    • sub2

Я попытался разбить строку и назначить его на новый класс в два этапа первого расщеплением, а затем assiging. Но я уверен, что делаю это неправильно, потому что в тот момент, когда я раскол, я теряю счет.

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(); 

Помогите пожалуйста?

+0

Какой выход вы сейчас получаете? –

+0

Я получаю категории и подкатегории Split. Но я получаю только их коды значений. Я не получаю их Displayname и Count –

+0

Покажите нам строку, которая разделена. – JBrooks

ответ

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)); 
    } 
Смежные вопросы