LINQ的嵌套组到嵌套对象

时间:2018-07-20 06:23:16

标签: c# performance linq refactoring

我无法使用LINQ查询解决此问题。

因此,我们具有Book的表结构,如下所示:

ApiService service = retrofit.create(ApiService.class);
Call<JsonResponse> call = service.getPopulationData();
call.enqueue(new Callback<JsonResponse> (){
@Override
public void onResponse(Call<JsonResponse> call, Response<JsonResponse> response) {
    Log.d("JSONData", response.body().toString());
    ArrayList<Worldpopulation> population=new ArrayList(response.body().getWorldpopulation());
}

@Override
public void onFailure(Call<JsonResponse> call, Throwable t) {
    Log.d("JSONData", t.getMessage());
}
});

我想先按图书馆分类,然后按书架分类。图书馆是书架的清单,书架是书的清单。性能很重要。这是真实数据的一部分。

LibraryId || LibraryName || ShelveId || ShelveName || Cost || Name || ForeName || Stuff

班级:

var table = new[] {
    new Book (1, "Green", 42, "A", 10, "Gra", "Bar", "etc."),
    new Book (1, "Green", 43, "B", 21, "Grb", "Bar", "etc."),
    new Book (2, "Blue", 652, "C", 10, "Blc", "Bar", "etc."),
    new Book (2, "Blue", 652, "C", 01, "Bl2", "Bar", "etc."),
    new Book (2, "Blue", 123, "D", 12, "Bld", "Bar", "etc."),
    new Book (8, "White", 94, "E", 14, "Foo", "Bar", "etc."),
    new Book (9, "Grey", 142, "F", 11, "Foo", "Bar", "etc."),
    new Book (9, "Grey", 142, "F", 12, "Bar", "Bar", "etc.")
};

我的行为很好,class Book { public int LibraryId {get;set;} public string LibraryName {get;set;} public int ShelveId {get;set;} public string ShelveName {get;set;} public int Cost {get;set;} public string Name {get;set;} public string ForeName {get;set;} public string Stuff {get;set;} public Book(int libraryId, string libraryName, int shelveId, string shelveName , int cost, string name, string foreName, string stuff) { LibraryId = libraryId; LibraryName = libraryName; ShelveId = shelveId; ShelveName = shelveName; Cost = cost; Name = name; ForeName = foreName; Stuff = stuff; } } class Library { public int Id {get;set;} public string Name {get;set;} public int Cost {get;set;} public List<Shelve> Shelves {get;set;} public Library (Shelve shelve) { Id = shelve.Books[0].LibraryId; Name = shelve.Books[0].LibraryName; Cost = shelve.Cost; Shelves = new List<Shelve> {shelve}; } } class Shelve { public int Id {get;set;} public string Name {get;set;} public int Cost {get;set;} public List<Book> Books {get;set;} public Shelve (Book book) { Id = book.ShelveId; Name = book.ShelveName; Cost = book.Cost; Books = new List<Book> {book}; } }

foreach

据我所知,这是一个O(n)解决方案。

现在,我想对其进行重构。我认为我们可以使用var libraries = new List<Library> { new Library (new Shelve(table[0])) }; foreach (var item in table.Skip(1)) { if (item.LibraryId != libraries.Last().Id) { libraries.Add(new Library(new Shelve(item))); continue; } if (item.ShelveId != libraries.Last().Shelves.Last().Id) { libraries.Last().Cost += item.Cost; libraries.Last().Shelves.Add(new Shelve(item)); continue; } libraries.Last().Cost += item.Cost; libraries.Last().Shelves.Last().Cost += item.Cost; libraries.Last().Shelves.Last().Books.Add(item); } var total = libraries.Sum(x => x.Cost); 做一些事情。我尝试过:

GroupBy

但是我不知道如何计算成本并将LibraryName和ShelveName分别添加到var grouped = table .GroupBy(l => new { l.ShelveId, l.LibraryId}) .GroupBy(l => l.Key.LibraryId); foreach(var country in grouped) { foreach(var state in country) { foreach(var personInState in state) { Console.WriteLine(personInState.Name); } } } Library中。

Try it Online!(具有基本测试)

1 个答案:

答案 0 :(得分:0)

也许您可以通过使用以下计算的属性来简化它

class Shelve
{
    public int Id {get;set;}
    public string Name {get;set;}
    public List<Book> Books {get;set;} = List<Book>();
    public int Cost 
    {
        get{ return this.Books.Sum(x => x.Cost); } 
    }
}

您可以对Library类进行同样的操作...

class Library
{
    public int Id {get;set;}
    public string Name {get;set;}
    public List<Shelve> Shelves {get;set;} = new List<Shelve>();
    public int Cost 
    {
        get{ return this.Shelves.Sum(x => x.Cost); } 
    }
}

我认为这可以使您的业务逻辑代码更加清晰,并且您无需为复杂的按表达式分组而烦恼