字符串表 c# 的列表

本文关键字:列表 字符串 | 更新日期: 2023-09-27 17:56:53

我的 c# 脚本有问题。我想创建一个字符串表列表,如下所示:

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

所以它应该看起来像这样,我的列表中应该有几个通信实例:信号=(通信1,通信2,...),每个通信有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 倍,如下所示

阿林克3

121us

通信6

阿林克3

121us

通信6

阿林克3

121us

通信6

阿林克3

121us

通信6

阿林克3

121us

通信6

阿林克3

121us

通信6

当我想我会看到列表的每个元素实际上是 6 个不同的字符串表时。

我不明白我的脚本有什么问题。我认为错误出在foreach循环的某个地方。

字符串表 c# 的列表

重新创建一个简单的示例:(当您在插入后实例化新的字符串数组时,它有效)

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

您似乎只是在列表中添加了 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);

如果使用相同的对象,则只会覆盖其数据。

输出是正确的:前 3 个输出行是你的第一个表(或 Signals.First())

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

就像您在表中输入它们一样。您有 6 个表 x 每个 3 行,因此 18 行。

在类中创建 使用通信列表向属性发出信号并删除字符串数组。

然后使用 Signal 类中的列表添加通信。

只要保持简单和干净,不要让自己很难

我只使用 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]);
}