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我希望找到一个副作用最小的解决方案,但我想这样做是将自己锁定在“无状态”验证的不必要复杂性中。