2015-06-18 3 views
2

У меня проблема с моим скриптом C#. Я хотел создать список строк таблиц следующим образом:Список строковых таблиц C#

public List<string[]> Signals = new List<string[]>(); 
public string[] Communication = new string[3]; 

Так как это должно выглядеть, я должен иметь несколько экземпляров связи, в моем списке: Сигналы = (Communication1, Communication2, ...) и каждый Связь имеет 3 строковых поля.

Когда я собрал мои 3 ДАННЫЕ связи (различные для каждого сообщения):

Communication[0]=CommunicationType; 
Communication[1]=CommunicationTime; 
Communication[2]=CommunicationName; 

хранить их в моем списке:

Signals.Add(Communication); // I have also tried .Insert with different Indexes 

Когда я несколько раз сделали, запасаются 6 разные таблицы связи, я хочу, наконец, увидеть каждый из моих экземпляров связи, поэтому я делаю следующее:

foreach (string[] Signal in Signals) 
{ 
    foreach (string CommunicationUnit in Signal) 
    { 
     Print(CommunicationUnit); 
    } 
} 

И все, что я могу видеть, как выход в 6 раз последний элемент вошел в список следующим образом

ARINC3

121us

Comm6

ARINC3

121us

Comm6

ARINC3

121us

Comm6

ARINC3

121us

Comm6

ARINC3

121us

Comm6

ARINC3

121us

Comm6

Когда я думал, что я хотел бы видеть каждый элемент в моем списке, которые являются на самом деле 6 различных строк таблицы.

Я не понимаю, что не так с моим сценарием. Я думаю, что ошибка где-то с петлями foreach.

+3

Используйте классы вместо 'string []'. –

+1

Мои психические навыки отладки говорят мне, что вы повторно используете один и тот же массив 'Communication' для всех 6, поэтому все они показывают последние данные, поскольку они используют одну и ту же ссылку. Вам будет лучше, чем другие, предлагать и создавать класс для моделирования вашей структуры данных. –

+1

Вы не видите код, который имеет проблему. Покажите полный код, в котором вы заполняете список сигналов с помощью массивов связи. Когда вы это сделаете, станет очевидно, что вы не создаете новый массив для каждого элемента List. Скорее, вы заполняете список ссылками на один и тот же массив снова и снова. – mbeckish

ответ

3

Воссоздание простого примера: (это работает, когда вы создавать новый массив строк после вставки)

List<string[]> Signals = new List<string[]>(); 
string[] Communication = new string[3]; 

Communication[0] = "a"; 
Communication[1] = "b"; 
Communication[2] = "c"; 

Signals.Add(Communication); 

Communication = new string[3]; 

Communication[0] = "d"; 
Communication[1] = "e"; 
Communication[2] = "f"; 

Signals.Add(Communication); 

foreach (string[] Signal in Signals) 
{ 
    foreach (string CommunicationUnit in Signal) 
    { 
     Console.WriteLine(CommunicationUnit); 
    } 
} 
+0

Почему foreach в foreach? было бы проще, если бы канал связи был включен в сигналы правильно? –

+1

вы также можете сделать это: Signals.SelectMany (x => x) .ToList(). ForEach (Console.WriteLine); 'но я сомневаюсь, что это облегчает его понимание. – stefankmitph

+0

HAHAHAHA XD, но все еще интересно, зачем делать список и помещать его в строку []. Я имею в виду, что вы можете просто перебирать список , а его намного проще, чем 2 цикла. –

0

Создание в вашем классе Сигнал свойства со списком сообщений и удалением массива строк.

Чем использовать список в классе Signal для добавления сообщений.

1

Выход правильно: первые 3 выходных линий ваша первая таблица (или Signals.First())

ARINC3 <- CommunicationType 
121us <- CommunicationTime 
Comm6 <- CommunicationName 

Так же, как вы ввели их в таблицу. У вас есть 6 таблиц по 3 строки, поэтому 18 строк.

2

Вы, кажется, просто добавьте 6 раз тот же объект связи в списке.

Если вы храните объект в списке, вы просто храните ссылку на него, а не копию.

затем, если вы добавите в первый элемент связи первый элемент связи, а затем измените его и добавьте снова, у вас будет всего 2 ссылки на один и тот же объект в памяти.

Это означает, что если вы обновите свой пункт связи, вы просто обновите все параметры в своем списке.

необходимо создать новый элемент связи для каждого.

Signals.Add(new string[3] { 
    CommunicationType, 
    CommunicationTime, 
    CommunicationName 
}); 
Signals.Add(new string[3] { 
    CommunicationType2, 
    CommunicationTime2, 
    CommunicationName2 
}); 

или

string[] Communication = new string[3]; 
Communication[0]=CommunicationType; 
Communication[1]=CommunicationTime; 
Communication[2]=CommunicationName; 
Signals.Add(Communication); 
string[] Communication2 = new string[3]; 
Communication2[0]=CommunicationType; 
Communication2[1]=CommunicationTime; 
Communication2[2]=CommunicationName; 
Signals.Add(Communication2); 

, если вы используете один и тот же объект, вы просто переписать его данные.

+0

это, скорее всего, случай здесь – greenfeet

+0

Хорошо спасибо за объяснение этого мне, но, как вы говорите, если каждый раз, когда я перезаписываю Связь, я на самом деле пишу те же данные во всем моем списке, почему он работает, когда я перезаписываю сообщение после каждой вставки с использованием Связь = новая строка [3]; ? – Jordan

+0

, потому что, когда вы используете «новое» ключевое слово, оно создает новый объект, а затем новую ссылку. но ваш предыдущий объект все еще находится в памяти, потому что он все еще используется вашим списком. у вас просто нет доступа к нему, если вы используете «Общение». – Demonia

0

Просто держите его легким и чистым, не делайте его трудно для себя достаточно сложным.

Я просто использую 1 цикл foreach вместо 2 и не делаю несколько списков. Я просто имею список и прохожу через него в своем foreach

List<string[]> Signals = new List<string[]>(); 
    string[] Communication = new string[3]; 

Communication[0] = "a"; 
Communication[1] = "b"; 
Communication[2] = "c"; 

Signals.Add(Communication); 
i 
foreach (string CommunicationUnit in Signals) 
{ 
    Console.Writeline(CommunicationUnit[i]); 

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