LINQ:从列表中选择一个项目,但它必须匹配两个值

时间:2018-04-22 21:54:41

标签: vb.net linq

我有以下列表 -

enter image description here

如何编写LINQ查询,它只给出了我有两个错误的请求号。结果,我只想要1个和6个请求号。

现在我使用下面的替代方法 -

Dim requestWithMultipleErrors As New List(Of String)
For Each requestObj As RequestErrorModel In requestErrorList
      Dim isError1 = (From item As RequestErrorModel In requestErrorList
            Where item.requestNumber = requestObj.requestNumber _
            AndAlso item.errorString.Contains("Error1")).Count > 0

      Dim isError2 = (From item As RequestErrorModel In requestErrorList
            Where item.requestNumber = requestObj.requestNumber _
            AndAlso item.errorString.Contains("Error2")).Count > 0

      If isError1 AndAlso isError2 AndAlso _
         Not requestWithMultipleErrors.Contains(requestObj.requestNumber) Then
             requestWithMultipleErrors.Add(requestObj.requestNumber)
      End If
Next

4 个答案:

答案 0 :(得分:2)

这是另一种方法:

Dim requestErrorList As New List(Of RequestErrorModel) From
{
    New RequestErrorModel With { .requestNumber = 1, .errorString = "Error1" },
    New RequestErrorModel With { .requestNumber = 1, .errorString = "Error2" },
    New RequestErrorModel With { .requestNumber = 2, .errorString = "Error1" },
    New RequestErrorModel With { .requestNumber = 3, .errorString = "Error2" },
    New RequestErrorModel With { .requestNumber = 4, .errorString = "Error1" },
    New RequestErrorModel With { .requestNumber = 5, .errorString = "Error2" },
    New RequestErrorModel With { .requestNumber = 6, .errorString = "Error1" },
    New RequestErrorModel With { .requestNumber = 6, .errorString = "Error2" }
}

Dim error1s = requestErrorList.Where(Function (x) x.errorString = "Error1").Select(Function (x) x.requestNumber)
Dim error2s = requestErrorList.Where(Function (x) x.errorString = "Error2").Select(Function (x) x.requestNumber)
Dim combined = error1s.Intersect(error2s)

这给出了:

1
6

另一种方法:

Dim errors = requestErrorList.ToLookup(Function (x) x.errorString, Function (x) x.requestNumber)
Dim combined = errors("Error1").Intersect(errors("Error2"))

答案 1 :(得分:1)

按RequestId对项目进行分组,然后检查组中是否存在所有选定的错误。

Dim errors = New List(Of String) From
{
    "Error1", "Error2"
}


var requestNumbersWithAllErrors = 
    requestErrorList.GroupBy(Function(request) request.RequestNo).
                     Where(Function(group) errors.All(Function(e) group.Contains(e))).
                     SelectMany(Function(group) group).
                     Select(Function(request) request.RequestNo)

For Each number As integer In requestNumbersWithAllErrors 
    Console.WriteLine(number)
Next

' Output
' 1
' 6

答案 2 :(得分:0)

假设您有一个RequestErrorModel的集合,其中包含2个属性:requestNumber(如Integer)和errorString,如下所示:

Dim requestErrorList As New List(Of RequestErrorModel)

requestErrorList.Add(New RequestErrorModel With { .requestNumber = 1, .errorString = "Error1" })
requestErrorList.Add(New RequestErrorModel With { .requestNumber = 1, .errorString = "Error2" })
requestErrorList.Add(New RequestErrorModel With { .requestNumber = 2, .errorString = "Error1" })
requestErrorList.Add(New RequestErrorModel With { .requestNumber = 3, .errorString = "Error2" })
requestErrorList.Add(New RequestErrorModel With { .requestNumber = 4, .errorString = "Error1" })
requestErrorList.Add(New RequestErrorModel With { .requestNumber = 5, .errorString = "Error2" })
requestErrorList.Add(New RequestErrorModel With { .requestNumber = 6, .errorString = "Error1" })
requestErrorList.Add(New RequestErrorModel With { .requestNumber = 6, .errorString = "Error2" })

您可以使用Group子句根据requestNumber进行分组,然后使用requestNumber方法返回errorStringCount()项:

' returns List(Of Integer) from requestNumber
Dim multipleErrorRequest = (From item As RequestErrorModel In requestErrorList
    Group item By item.requestNumber Into groupitem = Group
    Where groupitem.Count() = 2
    Select groupitem.FirstOrDefault().requestNumber
).ToList()

然后,您可以针对For Each使用multipleErrorRequest循环来获取每个值,或者如果您想直接转换为ConvertAll字符串集合,则可以使用requestWithMultipleErrors

Dim requestWithMultipleErrors As New List(Of String)

requestWithMultipleErrors.AddRange(multipleErrorRequest.ConvertAll(Function(x) x.ToString()))

工作示例:DotNet Fiddle

答案 3 :(得分:0)

根据requestErrorListRequestErrorModel列表,使用Linq GroupBy创建分组(IGrouping<TKey, TElement> Interface),考虑具有多个元素的组。

Dim ErrorGroups As List(Of IGrouping(Of Integer, RequestErrorModel)) = requestErrorList.
                   GroupBy(Function(errmod) errmod.requestNumber).
                   Where(Function(grp) grp.Count() > 1).
                   ToList()

返回一个具有相同requestNumber值的元素列表,按键分组。

使用Linq SelectMany可以展平分组,因为IGrouping实现了IEnumerable

Dim ErrorList As List(Of RequestErrorModel) = ErrorGroups.
                 SelectMany(Function(grp) grp).
                 ToList()

这当然可以一次完成:

Dim requestWithMultipleErrors As List(Of RequestErrorModel) = requestErrorList.
                                 GroupBy(Function(errmod) errmod.requestNumber).
                                 Where(Function(grp) grp.Count() > 1).
                                 SelectMany(Function(grp) grp).
                                 ToList()