【问题标题】:linq vb.net change valuelinq vb.net 改变值
【发布时间】:2013-01-31 16:03:52
【问题描述】:

如何更改对象列表中 1 个(或多个)指定项的 1 个属性

Class Item
    Private _Id As Integer
    Private _Value As Boolean 'can be string, int , .....

    Public Property Id() As Integer
        Get
            Return _Id
        End Get
        Set(ByVal value As Integer)
            _Id = value
        End Set
    End Property
    Public Property Value() As Boolean
        Get
            Return _Value
        End Get
        Set(ByVal value As Boolean)
            _Value = value
        End Set
    End Property

    Public Sub New(ByVal id As Integer, ByVal value As Boolean)
        Me.Id = id
        Me.Value = value
    End Sub       
End Class

...

Dim lst As New List(Of Item)
lst.Add(New Item(1, True))
lst.Add(New Item(2, True))
lst.Add(New Item(3, True))

lst = from l in lst select l ' and change the value of the element 2 to FALSE

结果

之前的列表

Item
[_Id = 1] 
[_Value = True] 

Item
[_Id = 2] 
[_Value = True] 

Item
[_Id = 3] 
[_Value = True] 

之后列出

Item
[_Id = 1] 
[_Value = True] 

Item
[_Id = 2] 
[_Value = False] 

Item
[_Id = 3] 
[_Value = True] 

【问题讨论】:

    标签: vb.net linq list


    【解决方案1】:

    Linq 用于查询而不是更新。要更新使用传统循环和/或索引器:

    l(2).Value = false
    

    或者,如果您想使用 Linq 来确定要更改的 个对象,只需遍历查询结果即可:

    Dim query = From l In lst Where l.Id = 2 Select l
    For Each l In query
       l.Value = false
    Next l
    

    或者,因为您只期望一项:

    Dim query = From l In lst Where l.Id = 2 Select l
    query.Single().Value = False
    

    然后,您的原始列表将有一个更新的项目,因为列表和查询保留了对项目的引用

    但是,如果您想要一个新的Items 列表,其值略有不同,那么这是可能的:

    Dim query = From l In lst _
                Select New Item With { _ 
                   ID = l.ID, _
                   Value = IIf(l.ID = 2, False, l.Value) _
                } 
    

    但请注意,这会创建新的Items,它不会修改存储在原始列表中的现有Items。

    【讨论】:

    • 我想保留列表的问题,所以你的第二个代码只保留选定的项目。
    • 和l(2).value它的位置,但是位置可以改变,我需要使用id值。
    • 如果 linq 不能这样做,我将使用旧循环和 if
    • @forX - 不确定我是否理解 - 你已经一个列表。我的第二个示例只是选择要更新的项目(修改以解决您的第二条评论)。您可以使用 Linq 选择 项,但不能修改 现有 项。如果您想要一个 new 列表,其中的项目略有不同,那么这是可能的。
    • 是的,我想要相同的列表,但有 1 个属性不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多