2016-03-29 52 views
0

我有一個在C#命名Cluster A類字典集羣目的:如何在自定義詞典C#添加元素

Dictionary<int, List<ClusterMember>>

int代表集羣IDList<ClusterMember>>代表成員集羣IDClusterMember是另一類。
我這裏顯示的整個代碼結構爲:

public class ClusterMember 
{ 
    public string _name { get; set; } 
} 

public class Cluster 
{ 
    public Dictionary<int, List<ClusterMember>> _dic { get; set; } 

    public Cluster(int _id, List<ClusterMember> _clusMem) 
    { 
     _dic.Add(_id, _clusMem); 
    } 
} 

,而我在這個方法中使用這些類爲:

public static List<Cluster> DP_Cluster(List<string> _customer, double _alpha) 
{ 
    var _currentClusters = 0; // current number of clusters i.e. "k" 
    var _memberNumber = 0; // running member number i.e. "n" 
    //var _dic = new Dictionary<int, List<string>>(); 
    var _probOld = 0.0; 
    var _probNew = 0.0; 


    List<Cluster> _myClusters = new List<Cluster>(); 
    //Cluster _cluster = new Cluster(?); 
    // How to Add cluster using above classes 
    // How to Add cluster Member using above classes 
    _myClusters.Add(_cluster); 

    //_dic.Add(_currentClusters, _customer.ElementAt(_memberNumber)); 
    _currentClusters += 1; 

    for(int _i = 1; _i < _customer.Count - 1; _i++) 
    { 
     if(_i <= _currentClusters) 
     { 
      _probOld = myClusters[_i].Members.Count/((_i+1) - 1 + _alpha); 
     } 
     else 
     { 
      _probNew = _alpha/((_i+1) - 1 + _alpha); 
     } 

     if(_probNew > _probOld) 
     { 
      // Add _customer.ElementAt(_memberNumber+=1) to New Cluster 
      Cluster cluster = new Cluster(_currentClusters += 1); 
      myClusters.Add(cluster); 
     } 
     else 
     { 
      // Add _customer.ElementAt(_memberNumber+=1) to Old Cluster 
     } 
    } 

    return myClusters; 
} 

現在我怎麼在Dictionary_dic對象添加for loop。此外我可以具有一個以上的集羣成員添加到一次以上相同_id作爲

  • 我可以添加集羣成員_id = 1在一個迭代中,
  • 然後必須添加一個簇構件到另一個 迭代的_id = 2
  • 那麼它可能轉向另一集羣成員添加到同一ID IE _id = 1和副已經RSA。

此外,它會更有意義,我如果有可能開始集羣ID1(不0默認_dic指數)的

請在這方面提供幫助!

+2

你能證明你的'爲loop'代碼? –

+0

我會考慮從集羣類中刪除集羣字典,因爲它應該只封裝一個集羣及其功能。也許考慮創建一個ClusterDictionary類並在其中添加用於添加集羣成員/刪除集羣成員的功能。 – sr28

+0

@ kienct89我已經顯示了包含'for loop'的整個'method' – maliks

回答

0

而且我可以有一個以上的集羣成員添加到同一個ID 不止一次

您可以檢查每一個循環迭代這樣的關鍵:

public void AddInCluster(int id, List<ClusterMember> _clusMem) 
{ 
    if (_dic.ContainsKey(id)) 
    { 
     foreach (var clusterMember in _clusMem) 
     { 
      _dic[id].Add(clusterMember);      
     } 
    } 
    else 
    { 
     _dic.Add(id, _clusMem); 
    } 
} 

或者您可以使用詞典中的TryGetValue:

public void AddInCluster(int id, List<ClusterMember> _clusMem) 
{ 
    List<ClusterMember> members; 
    if (_dic.TryGetValue(id, out members)) 
    { 
     foreach (var clusterMember in _clusMem) 
     { 
      members.Add(clusterMember); 
     } 
    } 
    else 
    { 
     _dic.Add(id, _clusMem); 
    }  
} 

此外,它會更有意義,我如果有可能與1

開始 集羣ID有關包裝你的intClusterId類可能引發異常,如果一個ID爲0? 也羣集類可以覆蓋在字典中的存取操作[]給出一個有意義的抽象在上下文(從1而不是0,例如開始)

您還可以添加一個Get喜歡你Add工作檢查這個ID存在:

public List<ClusterMember> GetFromCluster(ClusterId id) 
{ 
    if (_dic.ContainsKey(id)) 
    { 
     return _dic[id]; 
    } 

    throw new ClusterDoesNotContainsThisId(id); 
} 
0

如何使用DictionariesAdd方法?像:

if(needToAddNewCluster){ 
    _dic.Add(index, new List<ClusterMember>()); 
} 
if(needToExtendCluster){ 
    _dic[index].Add(clusMem); 
} 

在這方面,我認爲needToAddNewCluster會檢查_dic.ContainsKey(index)

0

您可以添加方法到羣集類

public void AddToCluster(int id, ClusterMember member) 
{ 
    // checks if cluster with specific id is already in Dictionary 
    if(!_dic.ContainsKey(id)) 
     _dic.Add(id,new List<ClusterMember>()); 

    _dic[id].Add(member); 
} 

你可以使用它在重複這樣的

int id = 1; // cluster id 
foreach(var m in members) 
{ 
    // adding members to cluster with id = 1 
    cluster.AddToCluster(id,m); 
} 

UPDATE

還可以,我們得到每個簇ID列表數即集羣成員計算每個集羣ID?

您可以添加這兩種方法

// get members count for specific cluster id 
public int GetCount(int id) 
{ 
    return _dict[id].Count; 
} 

// get members count for all clusters 
public Dictionary<int,int> GetCounts() 
{ 
    return _dict.ToDictionary(k=>k.Key,v=>v.Value.Count); 
} 

,你可以像這樣訪問

var counts = cluster.GetCounts(); 
var c1Cnt=counts[1]; // 1 is cluster id 
+0

@ stanke - 在你的方法'AddtoCluster'中我們如何擴展舊集羣? – maliks

+0

@ stanke - 我們也可以得到每個集羣ID的列表數量,即每個集羣ID的集羣成員數量? – maliks

+0

@maliks - 以什麼方式擴展? – stanke

相關問題