2017-05-31 47 views
0

我定义如下一个简单的类:在格言这个样子的合并两个词典进入观察的集合 - C#

Class Data 
{ 
public datetime DATES {get;set;} 
public double ValueA {get;set;} 
public double ValueB {get;set;} 
} 

Dictionary<double, Data> DictA= new Dictionary<double, Data>(); 
Dictionary<double, Data> DictB= new Dictionary<double, Data>(); 

值; (日期,值a)

1/1/2001, 100 
2/1/2001, 150 
3/1/2001, 400 

价值观DictB这个样子的; (日期,VALUEB)

2/1/2001, 200 
3/1/2001, 400 
4/1/2001, 300 
5/1/2001, 150 

我也有一个observable collection为:

ObservableCollection<Data> curveResults = new ObservableCollection<Data>(); 
public ObservableCollection<Data> CurveResults 
     { 
      get { return curveResults; } 
      set 
      { 
       curveResults = value; 
       base.OnPropertyChanged("CurveResults"); 
      } 
     } 

我想如果你要双空值获取集合填充为

Dates, ValueA, ValueB 
1/1/2001, 100, null 
2/1/2001, 150, 200 
3/1/2001, 400, 400 
4/1/2001, null, 300 
5/1/2001, null, 150 
+0

究竟有你观察到的与此有关呢? – NtFreX

+0

哦,我想用它来绘制数据。然后我会使用可观察的集合。 – user7157732

+0

你可以给'ObservableCollection'的构造函数''Dictionary'实现的'IEnumerable'。几乎每个集合都实现它。 – NtFreX

回答

0

属性,类数据应该是这样的:

class Data 
{ 
    public DateTime DATES { get; set; } 
    public double? ValueA { get; set; } 
    public double? ValueB { get; set; } 
} 

下面是代码:

 Dictionary<double, Data> DictA = new Dictionary<double, Data>(); 
     Dictionary<double, Data> DictB = new Dictionary<double, Data>(); 

     DictA.Add(0, new Data() { DATES = new DateTime(2001, 1, 1), ValueA = 100 }); 
     DictA.Add(1, new Data() { DATES = new DateTime(2001, 2, 1), ValueA = 150 }); 
     DictA.Add(2, new Data() { DATES = new DateTime(2001, 3, 1), ValueA = 400 }); 

     DictB.Add(0, new Data() { DATES = new DateTime(2001, 2, 1), ValueB = 200 }); 
     DictB.Add(1, new Data() { DATES = new DateTime(2001, 3, 1), ValueB = 400 }); 
     DictB.Add(2, new Data() { DATES = new DateTime(2001, 4, 1), ValueB = 300 }); 
     DictB.Add(3, new Data() { DATES = new DateTime(2001, 5, 1), ValueB = 150 }); 

     var tempDictA = DictA.Values.ToDictionary(x => x.DATES, x => x.ValueA); 
     var tempDictB = DictB.Values.ToDictionary(x => x.DATES, x => x.ValueB); 

     ObservableCollection<Data> result 
      = new ObservableCollection<Data>(tempDictB.Select(x => tempDictA.ContainsKey(x.Key) 
      ? new Data() { DATES = x.Key, ValueA = tempDictA[x.Key], ValueB = x.Value } 
     : new Data() { DATES = x.Key, ValueA = null, ValueB = x.Value }) 
     .Concat(DictA.Where(x => !tempDictB.ContainsKey(x.Value.DATES)) 
     .Select(x => new Data() { DATES = x.Value.DATES, ValueA = x.Value.ValueA, ValueB = null })) 
     .OrderBy(x => x.DATES));