是否有一种有效的方法来组合两个集合?

本文关键字:组合 两个 集合 一种 是否 有效 方法 | 更新日期: 2023-09-27 18:06:30

我有以下类:

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;
}

它可以工作,但是太慢了,特别是当记录开始达到数百条时。有没有更好的办法?

是否有一种有效的方法来组合两个集合?

看起来你只是想要一个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收集它们,然后遍历分数,将每个分数与相关体验的集合进行匹配,这样会更有效率。基本上它把一个0 (M * N)的操作变成了一个0 (M + N)的操作。

也许我错了,但是观察可观察的集合并实时收集总数并在某处积累结果而不是试图一次解决所有问题,这不是一个好主意吗?

这都是关于实现观察者/可观察模式的。由于您可以订阅集合更改,因此您可以在集合更改时执行操作。您还可以在Experience.ExTExperience.ExZ上实现INotifyPropertyChanged,并订阅来自所有对象的每个属性的更改。

通过这种方式,您不需要处理数百个对象,而只需显示在一段时间内积累的内容。