2015-08-05 3 views
3

У меня есть классы следующим образом:Есть ли эффективный способ объединения двух коллекций?

public class Root 
{ 
    public int Id {get;set;} 
    public string PlayerName{get;set;}  
} 

public class Scores:Root 
{ 
    public int GameT{get;set;} 
    public int GameZ{get;set;} 
} 

public class Experience:Root 
{ 
    public int ExT{get;set;} 
    public int ExZ{get;set;} 
} 

public class Total:Root 
{ 
    public int TotalT{get;set;} 
    public int TotalZ{get;set} 
} 

и TotalZ Общее число заводятся от добавления GAMET, внутр и Гамез, EXZ соответственно. У меня есть наблюдаемые коллекции очков и опыта, из которого я хочу, чтобы создать еще одну коллекцию Total, вот что я сделал до сих пор:

public ObservableCollection<Total> GetTotal(ObservableCollection<Scores> scores,ObservableCollection<Experience> experiences) 
{ 
var tc= new ObservableCollection<Total>(); 
foreach(var scr in scores) 
{ 
    foreach(var exp in experiences) 
    { 

    if(scr.Id==exp.Id) 
    { 
    var tt= new Total{ 
     Id=scr.Id, 
     Name=scr.PlayerName, 
     TotalT=scr.GameT+exp.Ext, 
     TotalZ=scr.GameZ+exp.Exz 
     }; 
    tc.Add(tt); 
    } 
    } 
} 
return tc; 
} 

Это работает, но это слишком медленно, особенно когда записи начинают ударил сотни. Есть ли способ лучше?

+0

Вам необходимо зарегистрироваться. –

+1

Я не думаю, что ваш текущий код даже скомпилировался бы - 'tt.Id = scr.Id должен быть просто' Id = scr.Id' - LHS '=' в инициализаторе объекта не может содержать '. ' –

+0

Если опыт всегда привязан непосредственно к заданной игре, почему эти два являются отдельными коллекциями? Почему не одна коллекция игр, каждая с двумя свойствами - оценка и опыт? – Luaan

ответ

2

Похоже, вы просто хотите LINQ внутреннего соединения:

var query = from score in scores 
      join exp in experiences on score.Id equals exp.Id 
      select new Total { 
       Id = score.Id, 
       Name = score.PlayerName, 
       TotalT = score.GameT + exp.Ext, 
       TotalZ = score.GameZ + exp.Exz 
      }; 
return new ObservableCollection<Total>(query); 

Это будет более эффективной итерация по всему опыту, чтобы начать с, собирая их ID, то Перебор баллов, соответствие каждого оценка с совокупностью связанных событий. В основном он превращает операцию O (M * N) в операцию O (M + N).

+0

сделаю это только сейчас .. –

0

Возможно, я ошибаюсь, но было бы неплохо наблюдать наблюдаемые коллекции и собирать итоговые данные в реальном времени и где-то накапливать результаты, а не пытаться решить проблему сразу?

Все дело в реализации наблюдаемого/наблюдаемого шаблона. Поскольку вы можете подписаться на изменения коллекции, вы можете делать что-либо всякий раз, когда меняется коллекция. Вы также можете реализовать INotifyPropertyChanged на Experience.ExT и Experience.ExZ и подписаться на изменения каждой собственности со всех объектов.

Таким образом, вам не нужно работать сотней объектов, но вы просто показываете, что накапливалось в течение определенного периода времени.

Смежные вопросы