2017-05-31 50 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));