我有以下列表 -
如何编写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
答案 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
方法返回errorString
个Count()
项:
' 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)
根据requestErrorList
,RequestErrorModel
列表,使用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()