代码之家  ›  专栏  ›  技术社区  ›  DarkLite1

获取唯一值

  •  1
  • DarkLite1  · 技术社区  · 7 年前

    我们正在尝试优化一些代码,以从 Array 尽可能快。通常,可以通过管道将输入连接到 Group-Object 然后只使用 Name 财产。但是我们希望避免管道,因为它比较慢。

    但是,我们尝试了以下代码:

    [System.Collections.ArrayList]$uniqueFrom = @() 
    
    $From = @('A', 'A', 'B')
    
    $From.Where({-not ($uniqueFrom.Contains($_))}).ForEach({
        $uniqueFrom.Add($_)
    })
    
    $uniqueFrom
    

    理论上,这应该是可行的。但由于某种原因,输出不是预期的 @('A', 'B') . 为什么不重新评估 ArrayList .where 条款?

    2 回复  |  直到 7 年前
        1
  •  2
  •   CodeNagi    7 年前

    DataView DataTable

    $arr = @('val1','val1','val1','val2','val1','val3'....)
    
    $newDatatable = New-Object System.Data.Datatable
    [void]$newDatatable.Columns.Add("FetchUniqueColumn")
    
    foreach($e in $arr)
    {
        $row = $newDatatable.NewRow()
        $row.Item('FetchUniqueColumn') = $e
        $newDatatable.Rows.Add($row)
    }
    
    $filterDataView     = New-Object System.Data.Dataview($newDatatable)
    $UniqueDT           = $filterDataView.ToTable($true,'FetchUniqueColumn')
    $UniqueValues_array = $UniqueDT.Rows.FetchUniqueColumn
    

    $true $UniqueDT

    $UniqueDT = $filterDataView.ToTable($true,'FetchUniqueColumn')
    

    **With 1 column Data Table as input
      Select -Unique - 300 ms 
      Using DataView - 21 ms
    
    **With @() array as input (converted SQL results to array prior to benchmarking)
      Select Unique  - 262 ms
      Using DataView - 106 ms 
    
        2
  •  1
  •   Robert Dyjas Joey    7 年前

    the accepted answer


    $From.Where({-not ($uniqueFrom.Contains($_))})
    

    $uniqueFrom.Add($_)
    

    [System.Collections.ArrayList]$uniqueFrom = @()
    

    $false $uniqueFrom.Contains($_)


    [System.Collections.ArrayList]$uniqueFrom = @()
    $uniqueFrom.add("A")
    $From.Where({-not ($uniqueFrom.Contains($_))}).ForEach({
        $uniqueFrom.Add($_)
    })
    

    A, B A $uniqueFrom B ForEach

    推荐文章