2016-03-15 2 views
2

Мне нужно хранить два типа информации в любой структуре данных для того, что я придумал для решения двухмерного массива в C#. Я должен хранить как:Альтернатива 2D-массиву в C#

  • номер кластера в int типа данных подсчитывать
  • членство кластера в int типа

данных Если я использую 2D массива, как:

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

Но проблема здесь:

  • Не знаю, что общего количества количество кластеров будет?
  • Я не знаю, что Кол-во участников у каждого кластера будет?

Так что вопрос: Как я могу управлять, чтобы сохранить эту информацию в C#?

ADDENDUM
Я должен использовать ответ от этого вопроса здесь, в этом методе, как:

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

Похоже, вы действительно должны иметь 'типа данных Cluster' с' собственностью членов организации, то просто создать '' List ... –

ответ

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); 

И вывести число членов для каждого кластера:

foreach(Cluster c in myClusters) 
    Console.WriteLine($"Cluster {c.ID} has {c.Members.Count} members."); 
+0

Ему нужно хранить только количество и количество. Разве он? –

+0

@ Rene - Как я могу получить количество кластеров и количество членов, которые кластер имеет i.e. memberCount для этого кластера, используя ваше предложение? – maliks

+0

@erkandemir говорит правильно, мне нужно хранить как _cluster 'x' имеет' a' members_, _cluster 'y' имеет' b' членов ..._ и так далее, не зная точное количество кластеров и членов кластера заранее – maliks

0

Вы можете рассмотреть возможность использования списка списков;

List<List<int>> clusters; 

Смотрите этот ответ на другой вопрос, для получения дополнительной информации, а также как сделать это в более универсальный класс: https://stackoverflow.com/a/1596563/6065552

+0

С одной кластерного междунаром и одного или несколькими членских Интсами, может быть, что-то вроде этого было бы лучше ... var clusterMembership = новый словарь >(); – Marc

+0

@Marc как «словарь» я могу удалить и вставить в него? Поскольку оба типа «cluster int» и «clusterMembership int» будут иметь одно значение, например, _cluster 1 имеет 2 члена, кластер 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. Он даже рассказывает вам, как получить счетчик кластеров и количество членов. Что можно сделать точно так же, используя мой пример. Возможно, вам стоит рассмотреть возможность редактирования сообщения и рассказать нам, что именно вы пытаетесь точно. –

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]; 
     } 
    } 
Смежные вопросы