是否有合并两个集合的有效方法?
Is there An Efficient way of combining two collections?
我有类如下:
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相加得到。我有一个可观察的分数和经验集合,我想从中创建另一个总计集合,这是我到目前为止所做的:
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;
}
它有效,但速度太慢,尤其是当记录开始达到数百时。有没有更好的方法?
您似乎只需要 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) 操作。
也许我错了,但观察可观察的集合并实时收集总数并在某处累积结果而不是试图一次解决所有问题不是一个好主意吗?
一切都是为了实施 observer/observable 模式。由于您可以订阅集合更改,因此您可以在集合更改时执行操作。您还可以在 Experience.ExT
和 Experience.ExZ
上实现 INotifyPropertyChanged
并订阅所有对象的每个 属性 的更改。
这样,您无需处理数百个对象,而只需显示在一段时间内积累的内容。
我有类如下:
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相加得到。我有一个可观察的分数和经验集合,我想从中创建另一个总计集合,这是我到目前为止所做的:
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;
}
它有效,但速度太慢,尤其是当记录开始达到数百时。有没有更好的方法?
您似乎只需要 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) 操作。
也许我错了,但观察可观察的集合并实时收集总数并在某处累积结果而不是试图一次解决所有问题不是一个好主意吗?
一切都是为了实施 observer/observable 模式。由于您可以订阅集合更改,因此您可以在集合更改时执行操作。您还可以在 Experience.ExT
和 Experience.ExZ
上实现 INotifyPropertyChanged
并订阅所有对象的每个 属性 的更改。
这样,您无需处理数百个对象,而只需显示在一段时间内积累的内容。