使用Linq更新列表的值

时间:2016-08-03 15:45:47

标签: vb.net linq list

有没有办法使用linq使用列表(字符串)更新列表(某些类)的值?例如,我得到了

Public class A
Public Property value As String
End Class

Public class B
Public Property AList As List(of A)
End Class

所以我得到了一个

Dim valueList As List(Of String)

我希望将AList的所有值设置为valueList的值。例如给出

valueList = {"A", "B", "C"}

我想要

AList = { AClass1, AClass2, AClass3 }

,其中

AClass1.value = "A"
AClass2.value = "B"
AClass3.value = "C"

1 个答案:

答案 0 :(得分:1)

不,因为LINQ不是为了产生副作用

但你可以用一个简单的for循环

来做到这一点
Public Class A
    Public Property Value As String
End Class

Public Class B
    Public Sub Foo()
        Dim AList As New List(Of A)
        AList.Add(New A)
        AList.Add(New A)
        AList.Add(New A)
        Dim valueList As New List(Of String)
        valueList.Add("A")
        valueList.Add("B")
        valueList.Add("C")
        For i As Integer = 0 To AList.Count - 1
            AList(i).Value = valueList(i)
        Next
        AList.ForEach(Sub(a) Console.WriteLine(a.Value))
    End Sub
End Class

输出

  

一个
  乙
  Ç

注意:

.ForEach扩展名是List<T>的成员,而不是IEnumerable<T>的成员,这是LINQ中提供的内容。有关使用LINQ可以执行的操作的完整列表,请参阅https://msdn.microsoft.com/en-us/library/system.linq.enumerable(v=vs.110).aspx

从技术上讲,您可以使用LINQ表达式来完成类似的事情。但这只是一种解决LINQ不应产生副作用的指导方法

Dim AList As New List(Of A)
AList.Add(New A)
AList.Add(New A)
AList.Add(New A)
Dim valueList As New List(Of String)
valueList.Add("A")
valueList.Add("B")
valueList.Add("C")
Alist = AList.Select(
    Function(a, i)
        ' the assignment is now inside the selector, which is not what
        ' the selector is meant to do which is transform the elements
        a.Value = valueList(i)
        Return i
    End Function).ToList()
AList.ForEach(Sub(a) Console.WriteLine(a.Value))

这对大多数开发者来说可能不太合适