Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ验证特定列中重复或无效字段的DataTable的最佳方法_C#_Asp.net_Linq_Optimization - Fatal编程技术网

C# 使用LINQ验证特定列中重复或无效字段的DataTable的最佳方法

C# 使用LINQ验证特定列中重复或无效字段的DataTable的最佳方法,c#,asp.net,linq,optimization,C#,Asp.net,Linq,Optimization,我试图找到确定DataTable 在特定列中包含重复数据 或 如果在外部字典中找不到所述列中的字段,并且结果值与字符串文字匹配 这就是我想到的: List<string> dtSKUsColumn = _dataTable.Select() .Select(x => x.Field<string("skuColumn"))

我试图找到确定
DataTable

  • 在特定列中包含重复数据
  • 如果在外部
    字典中找不到所述列中的字段,并且结果值与字符串文字匹配
  • 这就是我想到的:

    List<string> dtSKUsColumn = _dataTable.Select()
                                          .Select(x => x.Field<string("skuColumn"))
                                          .ToList();
    
    bool hasError = dtSKUsColumn.Distinct().Count() != dtSKUsColumn.Count() ||
        !_dataTable.AsEnumerable()
                   .All(r => allSkuTypes
                       .Any(s => s.Value == "normalSKU" && 
                                 s.Key == r.Field<string>("skuColumn")));
    
    List dtSKUsColumn=\u dataTable.Select()
    .选择(x=>x.字段所有类型
    .任何(s=>s.值==“正常库存单位”&&
    s、 Key==r.字段(“SKU列”);
    
    allSkuTypes
    是一个
    字典
    ,其中键是SKU本身,值是SKU类型

    我不能只对“distinct”
    \u dataTable
    进行操作,因为有一列必须包含相同的字段(由于我需要保留_dataTable的状态,因此无法删除和推断该列)


    因此,我的问题是: 我是以最好的方式处理这个问题,还是有更简单、更快的方法

    更新:
    DataTable不是通过SQL查询获得的,而是由电子表格或csv中的一组规则生成的。我只能将
    所有SKUtypes
    \u dataTable
    对象作为我唯一的“外部信息”。

    您的解决方案不是最优的

    N=\u dataTable.Rows.Count
    M=allSkuTypes.Count
    。您的算法具有O(2*N)空间复杂度(由
    ToList
    Disctinct
    调用分配的内存)和O(N*M)时间复杂度(由于
    allSkuTypes
    中对每个
    \u dataTable
    记录进行线性搜索)

    这是最佳解决方案。它使用单次传递
    \u数据表
    记录,使用
    哈希集
    检测重复项,使用
    字典
    TryGetValue
    方法检查第二条规则,从而得到O(N)空间和时间复杂度:

    var dtSkus = new HashSet<string>();
    bool hasError = false;
    foreach (var row in _dataTable.AsEnumerable())
    {
        var sku = row.Field<string>("skuColumn");
        string type;
        if (!dtSkus.Add(sku) || !allSkuTypes.TryGetValue(sku, out type) || type != "normalSKU")
        {
            hasError = true;
            break;
        }
    }
    
    var dtSkus=newhashset();
    bool hasrerror=false;
    foreach(变量行在_dataTable.AsEnumerable()中)
    {
    var sku=行字段(“sku列”);
    字符串类型;
    如果(!dtSkus.Add(sku)| |!allSkuTypes.TryGetValue(sku,out type)| | type!=“normalSKU”)
    {
    hasrerror=true;
    打破
    }
    }
    

    另外一个好处是,您有一行规则被破坏了,代码可以很容易地修改,以根据破坏的规则采取不同的操作,仅收集/计数第一个或所有无效记录等。

    如果您首先使用EF db,那么最快的方法是用sql编写函数并将其映射到[EdmFunction]@Nathan,我更新了我的问题,因为这意味着_dataTable是通过SQL查询或类似方式获得的。此外,我必须将其视为_dataTable和allskutype是我唯一可以访问的,并且是不可变的。+1我希望找到一个副作用最小的解决方案,但我想这样做是将自己锁定在“无状态”验证的不必要复杂性中。