我的课程如下:
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}
}
TotalT和TotalZ分别来自添加GameT,ExT和GameZ,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 :(得分: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)运算。
答案 1 :(得分:0)
也许我错了,但是观察可观察的集合并实时收集总数并在某处累积结果而不是试图一次性解决问题不是一个好主意?
这是关于实现观察者/可观察模式的全部内容。由于您可以订阅集合更改,因此您可以在集合更改时执行操作。您还可以在INotifyPropertyChanged
和Experience.ExT
上实施Experience.ExZ
,并订阅所有对象中每个属性的更改。
这样,您不需要处理数百个对象,但只需显示在某段时间内累积的内容。