c# 需要在 DataTable 中删除和添加特定值的行

c# Need to remove and add a row in a DataTable at a specific value

我有一个 DataTable dt,其中有一个字符串列 Salenumber。 我需要删除 Salenumber 介于 1 - 5999 之间的行并将该行移动到 DataTable dt2。

类似这样,但是当您要删除行时 foreach 将不起作用。

DataTable dt2 = new DataTable();
          dt2 = CreateNewDataTable.NewDataTable();

        foreach (DataRow row in dt.Rows)
        {
            double RowDoubleValue;
            if (Double.TryParse(row["Salenumber"].ToString(), out RowDoubleValue) && RowDoubleValue >= 1.0 && RowDoubleValue <= 5999.0)
            {
                dt2.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
            }

        }

避免在 foreach 枚举期间无法修改集合的问题的一种方法是使用另一个集合来存储要修改的项目,例如:

List<DataRow> rowsToRemove = new List<DataRow>();
foreach (DataRow row in dt.Rows)
{
    double RowDoubleValue;
    if (Double.TryParse(row["Salenumber"].ToString(), out RowDoubleValue) && RowDoubleValue >= 1.0 && RowDoubleValue <= 5999.0)
    {
        rowsToRemove.Add(row);
    }
}

foreach(DataRow row in rowsToRemove)
{
    dt2.ImportRow(row); //Copy
    dt.Rows.Remove(row); //Remove
}

另一种更易读且更简短的方法是 LINQ:

var rowsToImport = from row in dt.AsEnumerable()
                   let salesNumDouble = row.Field<string>("Salenumber").TryGetDouble()
                   where salesNumDouble.HasValue 
                   && salesNumDouble.Value  >= 1.0 &&  salesNumDouble.Value <= 5999.0
                   select row;
DataTable dt2 = rowsToImport.CopyToDataTable();

我已经使用这个扩展来尝试将字符串解析为 double?:

public static Double? TryGetDouble(this string item, IFormatProvider formatProvider = null)
{
    if (formatProvider == null) formatProvider = NumberFormatInfo.CurrentInfo;
    Double d = 0d;
    bool success = Double.TryParse(item, NumberStyles.Any, formatProvider, out d);
    if (success)
        return d;
    else
        return null;
}

你不应该在 foreach 进程中修改集合,你可以使用 DataTable.Select 作为简单的解决方案

    DataTable dt;
    DataTable dt2;
    var rows = dt.Select("Salenumber >=1 and Salenumber<5999");
    foreach (var row in rows)
    {
        dt.Rows.Remove(row);
    }
    dt2.Rows.Add(rows);