我有两个我希望彼此比较的字符串数组。一个数组(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
答案 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 })