2016-03-15 78 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]; 
     } 
    }