2016-09-11 2 views
0

Я хочу динамически заполнять 3D-массив. Я делаю NLP, и для этого хочу, чтобы мои предложения и жетоны и теги были на одном месте. Поэтому я хочу, чтобы три из них были в одном трехмерном массиве, поэтому я могу получить к ним доступ сразу, и я хочу динамически его заполнять этим материалом. У меня есть предложения в массиве 1D и токенах и тегах в 2D-массиве. Как я могу добавить их в 3D-массив? вот что я сделал до сих пор:Как динамически заполнять 3D-массив через циклы в C#?

//getting result 
result = reader.ReadToEnd(); 
richTextBox2.Text = result; 
var lines = richTextBox2.Lines; 
sentences = lines[0].Split('.'); //getting sentences 

String[,] tagged_data = new String[1000, 2]; 
String input = lines[2]; 
String first = input.Substring(2, input.Length - 2); 
Console.WriteLine(first); 
String second = first.Substring(0, first.Length - 2); 
Console.WriteLine(second); 

Regex regex = new Regex(@"\'([^\']*)\'"); 
MatchCollection matches = regex.Matches(second); 

int count = 0; 

for (int j = 0; j < tagged_data.Length; j++) 
{ 
    for (int k = 0; k < 2; k++) 
    { 
     if (count < matches.Count) 
     { 
      tagged_data[j, k] = matches[count].Value; 
      count++; 
      Console.WriteLine(tagged_data[j, k]); 
     } 
     else 
      break; 
    } 
} 
+0

Просьба предоставить образец данных. – jdweng

+0

предложения представлены в массиве 1D, но я не хочу, чтобы предложения были в моем трехмерном массиве, я просто хочу их индексы. во-вторых, токены и их соответствующие теги находятся в 2D-массиве. например tag_data [0,0] = 'кодирование'; и tag_data [0,1] = 'verb'. надеюсь, что это поможет вам понять мою проблему. –

+0

Вы рассматривали List >? – jdweng

ответ

1

предложения, жетоны и теги не звучат, как вещи, чтобы быть помещены в 3D массив для меня. Вероятно, вам не нужен кубовидный, но неровный массив, т. Е. Массив массивов массивов.

Например, у вас может быть массив предложений, в которых каждое предложение может иметь различное количество токенов и каждый токен различного количества тегов.

string[] sentences = GetSentences(text); 
string[][][] result = new string[sentences.Length][][]; 
for (int i = 0; i < sentences.Length; i++) { 
    string[][] tagsAndTokens = GetTagsAnTokens(sentence); 
    result[i] = tagsAndTokens; 
} 

Однако проблема с этим подходом состоит в том, что этот массив результатов хранит только одну строку в позиции; вероятно, теги в вашем случае. N-мерный массив или зубчатый массив только когда-либо хранят вещи самого глубокого уровня гнездования. Где вы храните другие вещи?

Не будет ли структура класса обрабатывать ее лучше?

class Sentence 
{ 
    public string Text { get; set; } 
    public Token[] Tokens { get; set; } 
} 

class Token 
{ 
    public string Text { get; set; } 
    public string[] Tags { get; set; } 
} 

Тогда вы бы построить массив предложений

Sentence[] sentences = ...; 

Часто вы не знаете максимальный размер коллекции заранее. В таких случаях List<T> лучше, чем T[]. Если вам нужен массив в каком-то момент, вы можете легко преобразовать его в массив позже

List<string> l = new List<string>(); 
l.Add("..."); 
l.Add("..."); 
string[] a = l.ToString(); 

В соответствии с вашими объяснениями вы просто хотите сохранить индекс предложений вместе с мечеными данными и сохранить предложений в отдельном массиве. Если новый трехмерный массив (или, может быть, комбинация массивов и списков?) Имеет ту же длину, что и массив предложений, нет смысла хранить индекс, так как каждая запись имеет тот же индекс, что и соответствующее предложение.

Но Трудно понять, что вы имеете в виду, даже видя свой код. Можете ли вы показать нам образец входных данных?

+0

У меня уже есть предложения в массиве. (Я получаю все эти данные из моего приложения python в приложении C#). на самом деле я должен применить некоторые nlp-правила к этим данным. Я могу применить правила на токенах первого предложения, но действительно не знаю, как перейти к токенам следующего предложения? и токены всех предложений находятся в 2D-массиве –

+0

, и я не понимаю, как это будет с помощью структуры классов. –

+0

это хочу, я хочу: String [] [] [] arr = новая строка [предложения.длина] [] []; скажем, есть 2 предложения: {{'coders', 'noun'}, {'work', 'verb'}, {'hard', 'verb'} }, {{'coders ',' noun '}, {' work ',' verb '}, {' hard ',' verb '} } }; –

Смежные вопросы