2016-01-11 89 views
0

我有两个字符串数组,我想要相互比较。一个数组(sProdList)将总是一个设置大小(16个值),另一个(sProd)可能是16个,但它可能是更多或更少的值。我想看看sProd是否包含sProdList中的任何值。比较不同大小的字符串数组

我用下面的LINQ尝试了这一点:

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

的想法是,如果sProd的当前值是在sProdList它进入if语句,否则跳过它。

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

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

'Separate out Product Names 
    Dim sProd() As String = {} 
    Dim sInst() As String = {} 
    Dim sProdList() As String = {"Auto", "Chequing", "GIC", "Mutual Funds", "Real Estate", "RIF", "RSP", "Savings", "Shares", "Stock", "TFSA", "CCard", "Guar", "Loan", "Loc", "Mortgage"} 
    sProd = objNode.InnerText.Split(",") 

    objNode = Nothing 

    objNode = objXMl.SelectSingleNode("//Inst") 

    sInst = objNode.InnerText.Split(",") 

    Dim instPos As Integer = 0 
    For Each st As String In sProdList 
     If Array.Exists(sProd, Function(x As String) sProdList.Contains(x)) Then 
      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 
     End If 
    Next 

     dgProduct.DataSource = dt 
+0

你得到你所期望的结果?当使用像'Contains'这样的Linq方法时,我不会完全信任调试器。 Linq在源代码集合中添加了可以在调试时提供误导性信息的包装器。 –

+0

不,目前我的sProd有4个值,3个在sProdList中,有一个没有。它不应该输入第四个值的If语句,但它是。 –

+0

必须注意,您应该启用Option Strict。 – Plutonix

回答

2

你迭代sProdList但检查整个列表每次

您可以只使用LINQ的Contains方法,看看是否sProd包含字符串:

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

Bluh,它总是最简单的代码,不是吗?谢谢您的帮助 :)! –

1

你迭代sProdList,所以你不希望在循环中比较所有的人,但你可以使用.Intersect改变循环超过了在这两个像这样的人只是循环:

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