【问题标题】:Checking strings held in a list against those being read in from another device检查列表中保存的字符串与从其他设备读取的字符串
【发布时间】:2013-11-03 16:33:20
【问题描述】:

我有一个列表,其中包含我已经设置的数据:

public List<string> stringValues = new List<string>();


void Start() 
{   
    stringValues.Add( "D5B51D14-9ED8-1530-5455-CFF2C4B86151");
    stringValues.Add( "335B8649-AB22-E146-05A0-E9A4F3813A1F");
    stringValues.Add( "28797BB5-9020-C0B5-F0CE-72AB7F1830E2");
    stringValues.Add( "CD377141-422D-E8B0-B845-A0AF408E565A");
    stringValues.Add( "DEEE65FB-FF1F-A6A9-4C3C-5784F41B0D39");
    stringValues.Add( "70489FFA-6C88-A40D-C615-FD1EDEBD7643");

}

我还有一种方法可以读取从设备发送来的数据并将其显示在屏幕上。我不得不从字符串上剪下一小段,以确保我只得到我想要的数据,并出现在屏幕上。

这是该方法的样子:

private void AppendString(string message) 
{
    int startIndex = 38;
    int endIndex = 36;
    message = message.Substring(startIndex,endIndex);
    messageCount = "length is " + message.Length.ToString();
    outputContent.text += "\n" + message;
}

问题是,发送到我的程序中的数据是我不知道的。它可以包含任何东西。我需要我的程序做的是检查我需要的字符串部分,并将它找到的值与我列表中的值进行比较。然后,如果列表包含相同的数据,请执行一些操作。

如何将我的列表与使用上面的代码动态传递给它的数据进行比较?

编辑

我会稍微解释一下 appendMessage 函数以及为什么会这样:

我读入的设备通过以下方式发送数据:

<CBPeripheral: 0xda4bab0 identifier = D5B51D14-9ED8-1530-5455-CFF2C4B86151, Name = "estimote", state = connecting>

大部分都很好,但我唯一关心的部分是行的标识符部分中保存的长数字。在我的程序中,当我运行应用程序时,它没有显示整行,它输出的唯一部分就是那里的那个数字。没有其他的。

因此,在切掉那条线之后,我将存储在一个名为 outputContent 的 UILabel(统一 gui 字符串)中,并且当我调用 outputContent.text 时,我正在访问其中保存的数据

结合下面给出的示例答案,我的列表检查如下所示:

if(stringValues.Contains(outputContent.text))
{
    Instantiate(estimote6Model, new Vector3(2.5f,0.7f,0), Quaternion.identity);
    uuidString = "got an estimote 6";
}

但是,虽然显示的字符串是我想要的行的一部分,但没有任何反应,我仍在尝试找出原因。

【问题讨论】:

  • 起始索引不能大于结束索引。您是否要比较最后 4 个字符?
  • 不,我得到的整个字符串实际上是: 我想要的只是检查在上述情况下的标识符号是 D5B5 等,它从 38 开始。然后我希望它只检查 36 个字符长的数字的长度。

标签: c# list unity3d


【解决方案1】:

您可以使用.Contains() 方法搜索列表。所以是这样的:

if (stringValues.Contains(message))
{
   // do something
}

您可以在 AppendString() 方法的末尾添加此片段,因为在那里,变量 message 应该包含 ID,这可能是 stringValues 列表的一部分,对吧?

如果您不想在 AppendString() 方法中检查这一点,则必须将设备中的 id 存储在单独的列表中:

public List<string> deviceValues = new List<string>();

private void AppendString(string message) 
{
    int startIndex = 38;
    int endIndex = 36;
    message = message.Substring(startIndex,endIndex);
    messageCount = "length is " + message.Length.ToString();
    outputContent.text += "\n" + message;

    deviceValues.Add(message); // add here the input from the device
}

然后您可以检查stringValues 是否包含来自deviceValues 的任何值:

if (stringValues.Any(x => deviceValues.Contains(x)))
{
   // do something
}

【讨论】:

  • outputContent.text 中存储"\n" + message。这意味着,有一个“\n”和您搜索的消息,这不匹配。 if 应该在您的代码中的什么位置?如果这应该在方法AppendString() 内,您应该使用message 而不是outputContent.text。如果没有,您应该将message 的值添加到单独的列表中。但是你不能做的是检查outputContext.text中的值,只要其中有一个\n
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2018-08-27
  • 2013-01-09
相关资源
最近更新 更多