【问题标题】:Improve coding with List Intersect using Net 3.5使用 Net 3.5 通过 List Intersect 改进编码
【发布时间】:2010-10-01 14:47:09
【问题描述】:

我有一个具有 ID 列表的类,该类具有从对象列表中添加新 ID 的功能。

我已经解决了这个问题,但我确信这可以用更少的代码来完成。

Public Class Page

  Private _IdList As List(Of Integer)
  Private _HasNewItems As Boolean = False

  Public Sub AddItems(ByVal Items As List(Of Item))

    Dim itemsID = From itemX In Items _
                  Select itemX.ID

    Dim list As List(Of Integer) = itemsID.ToList

    If _IdList.Intersect(list).Count = list.Count Then
      _HasNewItems = False
    Else
      _HasNewItems = True
      _IdList.AddRange(list)
      _IdList = _IdList.Distinct
    End If

  End Sub

End Class

那么从 NET 3.5 的角度来看,如何用更少的代码和更多的代码来完成...

【问题讨论】:

    标签: .net vb.net linq .net-3.5


    【解决方案1】:

    为了完整起见,这里有一个 VB 版本,取决于使用 HashSet 的建议:

    Public Class Page
    
      Private _IdList As HashSet(Of Integer)
      Private _HasNewItems As Boolean = False
    
      Public Sub AddItems(ByVal Items As List(Of Item))
    
        Dim itemsID = From itemX In Items _
                      Select itemX.ID
    
        Dim localResult as Boolean
    
        For Each id As Integer In itemsID
         localResult = _IdList.Add(id)         
         _HasNewItems = _HasNewItems OrElse localResult
        Next
      End Sub
    
    End Class
    

    【讨论】:

      【解决方案2】:

      如果您的代码允许,您可以将 ID 存储在 HashSet 而不是列表中。然后,您可以将所有“新”ID 添加到 HashSet 而无需创建重复项。

      编辑 - 添加代码(对不起 c#):

          HashSet<int> idList;
          void AddItems(List<Item> items)
          {
              idList.UnionWith(from item in items select item.Id);
          }
      

      【讨论】:

        【解决方案3】:

        试试下面的

        Public Sub AddItems(ByVal items as List(Of Item))
          Dim oldCount = _IdList.Count
          _IdList.AddRange(items.Select(Function(x) x.ID).Except(_IdList))
          _HasNewItems = oldCount < _IdList.Count
        End Sub
        

        这里的技巧是,当它们出现在作为参数传递的可枚举中时,Except 将返回所有项目(在本例中为 _IdList)。所以 items.Except(_IdList) 是所有新项目。

        【讨论】:

          猜你喜欢
          • 2012-08-26
          • 2012-03-22
          • 2011-05-01
          • 1970-01-01
          • 2013-01-13
          • 1970-01-01
          • 2011-03-07
          • 1970-01-01
          • 2011-08-04
          相关资源
          最近更新 更多