比较不同大小的字符串数组

时间:2016-01-11 15:53:26

标签: arrays vb.net linq

我有两个我希望彼此比较的字符串数组。一个数组(sProdList)将始终是一个设置大小(16个值),另一个(sProd)可能是16,但它可能是更多或更少的值。我想看看sProd是否包含sProdList中的任何值。

我使用下面的LINQ试试这个:

UPDATE mytable
SET    col = CASE WHEN col INSTR(col, ':val') = 0
                   THEN CONCAT(col,':newval')
                   ELSE SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "It is duplicate";
             END,
WHERE id = 2;

这个想法是,如果sProd的当前值在sProdList中,它会进入If语句,否则会跳过它。

在调试我的代码时,我发现x的值是24,我不知道它从哪里得到这个值,因为我的数组都没有24个项目。

代码如下,任何帮助将不胜感激:

If Array.Exists(sProd, Function(x As String) sProdList.Contains(x)) Then

2 个答案:

答案 0 :(得分:2)

您正在迭代sProdList,但每次都要检查整个列表

您可以使用Linq Contains方法查看sProd是否包含字符串:

For Each st As String In sProdList
    If sProd.Contains(st) Then
        ....

答案 1 :(得分:1)

您正在迭代sProdList,因此您不希望在循环中比较所有这些,但您可以使用.Intersect更改为循环以循环覆盖这两者中的那些:< / p>

For Each st As String In sProdList.Intersect(sProd)
    If sInst(instPos) = "PCCU" Then
        img = My.Resources.check
    ElseIf sInst(instPos) <> "PCCU" OrElse sInst(instPos) = "" Then
        img = My.Resources.exclamation
    Else
        img = My.Resources.redX
    End If

    dt.Rows.Add(New Object() {st, imageToByteArray(img)})
    instPos += 1
Next If

此外,您可以进一步使用LINQ来创建查询并直接将其提供给dgProduct.DataSource,而不是像DataTable一样使用这样的包装:

Dim imgs = sInst.Select(Function(i) imageToByteArray(If(i = "PCCU", My.Resources.check, If((i <> "PCCU" OrElse i = ""), My.Resources.exclamation, My.Resources.redX))))
dgProduct.DataSource = sProdList.Intersect(sProd).Zip(imgs, Function(product, image) New From { product, image })