2016-03-15 24 views
2

我必須在任何數據結構中存儲兩種類型的信息,我想出了C#中二維數組的廢料解決方案。我必須爲存儲:替代二維數組在C#

  • 數簇int數據類型
  • 羣集成員計數int數據類型

如果我使用2D陣列如:

Int32[,] _clusterMembership = new Int32[10, 10]; 

但這裏的問題是:

  • 我不知道總共數集羣會是?
  • 我不知道會員人數每個集羣都會有嗎?

所以問題是: 如何設法將這些信息存儲在C#中?

附錄
我必須在這個方法在這裏使用的答案來自這個問題爲:

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(_currentClusters += 1); 
     cluster.Members.Add(new ClusterMember { Name = _customer.ElementAt(_memberNumber) }); 
     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); // Here is an error as we defining same name for another cluster 
       myClusters.Add(cluster); 
      } 
      else 
      { 
       // Add _customer.ElementAt(_memberNumber+=1) to Old Cluster 
      } 
     } 

     return myClusters; 
    } 
  • 我應該如何更新我的方法來獲得想要的結果?
+1

這聽起來像你真的應該有一個'Members'屬性'Cluster'數據類型,那麼只需要創建一個列表'' ... –

回答

1

您應該考慮兩種類型,一種爲集羣和一個用於成員:

成員

public class ClusterMember 
{ 
    public string Name {get;set;} 
    // more properties... 
} 

集羣

public class Cluster 
{ 
    public int ID {get;} 
    public List<ClusterMember> Members {get;} 
    public Cluster(int id) 
    { 
     ID = id; 
     Members = new List<ClusterMember(); 
    } 
} 

然後你就可以將您的集羣列表

List<Cluster> myClusters = new List<Cluster>(); 
Cluster cluster = new Cluster(1); 
cluster.Members.Add(new ClusterMember { Name = "Member1" }); 
myClusters.Add(cluster); 

UPDATE我認爲你要與你的數據做的不僅僅是存儲這兩個信息,並試圖提供一個更好的面向對象的方法。

爲了讓您的罪狀:

int totalNumberOfClusters = myClusters.Count; 
int numberOfMembersInOneCluster = cluster.Members.Count; 
int totalNumberOfClusterMembers = myClusters.Sum(c => c.Members.Count); 

並輸出成員每個集羣的數量:

​​3210
+0

他只需要存儲數字和計數。他不是嗎? –

+0

@ Rene - 如何使用您的建議獲得集羣成員的集羣數量和成員數量,即該集羣的memberCount? – maliks

+0

@erkandemir說得對,我需要預先存儲_cluster'x'有'a'成員_,_cluster'y'有'b'成員...等等,而不必事先知道確切數量的簇和簇成員 – maliks

0

你可以考慮使用列表的列表;

List<List<int>> clusters; 

查看另一個問題這個答案的詳細信息,以及如何使之成爲一個更通用類:https://stackoverflow.com/a/1596563/6065552

+0

有了一個集羣int和一個或多個成員整數,也許像這樣的東西會更好... var clusterMembership = new Dictionary >(); – Marc

+0

@Marc,因爲它是一個'Dictionary'我可以刪除並插入它嗎?由於'cluster int'和'clusterMembership int'都是單值,例如_cluster 1有2個成員,所以cluster 3有4個成員...._,所以它會在不同的迭代中被改變,即'clusterMembership' – maliks

+0

要添加您將使用clusterMembership.Add(123,新列表 {456,789});.如果你想刪除123羣集,你可以使用clusterMembership.Remove(123);.如果你想向羣集添加成員,你可以使用clusterMembership [123] .Add(444);.要從羣集中刪除成員資格,您可以使用clusterMembership [123] .Remove(456);. – Marc

2

如已經提及。你可以簡單地使用一個列表。最底層的代碼示例顯示瞭如何創建您需要的列表類型以及如何添加和訪問該列表中的值。

using System.IO; 
using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     //Creating a list of lists that contains integers 
     List<List<int>> clusters = new List<List<int>>(); 
     //each list in the above list consists of a list of integers. So we need to add list of integers to that list 
     List<int> row = new List<int>(); 
     //now we add integers to the list 
     row.Add(1); row.Add(2); row.Add(3); row.Add(4); 
     //Now we add the list of integers to the list of lists of integers 
     clusters.Add(row); 

     foreach(List<int> rows in clusters) 
     { 
      foreach(int num in rows) 
      { 
       System.Console.WriteLine(num); 
      } 
     } 
     Console.WriteLine("number of rows: {0}", clusters.Count); 
     Console.WriteLine("number of elements in the first row: {0}", clusters[0].Count); 
    } 
} 
+0

簡單而簡潔的例子。 –

+0

@Psioniax這不是我要求的,請 – maliks

+1

@maliks這正是你所要求的。您可以動態添加和刪除每個列表的成員,而無需定義任何列表的有限大小。除了他定義了一個ClusterMember類之外,Rene還展示了完全相同的東西。他甚至會告訴你如何獲得羣集數量和成員數量。這可以用我的例子完全相同的方式完成。也許你應該考慮編輯你的帖子,並告訴我們你準確地嘗試了什麼。 –

0

您可以將數據存儲在具有keyvaluepair項目的列表中。 或者使用字典

List<KeyValuePair<int, int>>() 

Dictionary<int,int>(); 

所以你可以爲每個羣集添加新keyvaluepair。

0
static void Main(string[] args) 
    { 
     var clusterMembership = new Dictionary<int, int>(); 

     //Add cluster 123 and assign a member count of 4 
     clusterMembership.Add(123, 4); 

     //Change member count for cluster 123 to 5 
     clusterMembership[123] = 5; 

     //Remove cluster 123 
     clusterMembership.Remove(123); 

     //Get the number of clusters in the dictionary 
     var count = clusterMembership.Count; 

     //Iterate through the dictionary 
     foreach(var clusterKey in clusterMembership.Keys) 
     { 
      var memberCount = clusterMembership[clusterKey]; 
     } 
    }