使用Linq过滤数据表到列表

时间:2017-08-29 05:38:55

标签: c# linq

DataTable dttoexcel=some data source;
String[] pro = { "Az","Bz","X" };

for (int f = 0; f < pro.Length; f++)
{
    var LoginDetails = dttoexcel.Rows
                       .Cast<DataRow>()
                       .Where((r => r.Field<string>("Subcategoryname") == pro[f]))
                       .ToList();
}

每次使用新数据更新列表时,旧数据都将被覆盖。我希望将所有数据存储到列表中,而不会丢失旧数据。

请帮我解决这个问题。

4 个答案:

答案 0 :(得分:0)

每次迭代都会创建新的LoginDetails对象,因此您需要将过滤后的数据存储在某个位置,例如使用ListAddRange在同一类型Concat中存储方法。你可以尝试这样的事情:

 DataTable dttoexcel = some data source;
 String[] pro = { "Az", "Bz", "X" };
 List<DataRow> loginDetails = new List<DataRow>();
 for (int f = 0; f < pro.Length; f++)
 {
     loginDetails.AddRange(dttoexcel //or Concat method
         .AsEnumerable()
         .Where((r => r.Field<string>("Subcategoryname") == pro[f]))
         .ToList());
 }

AddRangeConcat方法具有不同的语义:

AddRange - 通过向其添加项来修改源列表。

Concat - 返回源列表,添加新项目,而不修改源列表。

更新

要创建包含过滤结果的新DataTable,只需执行以下操作:

DataTable filteredTable = new DataTable();
filteredTable = loginDetails.CopyToDataTable();

答案 1 :(得分:0)

    DataTable dttoexcel=some data source;
    String[] pro = { "Az","Bz","X" };
    List<dynamic> LoginDetails = new List<dynamic>();
    for (int f = 0; f < pro.Length; f++)
    {

         LoginDetails.AddRange(dttoexcel.Rows
                     .Cast<DataRow>()
                     .Where((r => r.Field<string>("Subcategoryname") == 
          pro[f])).ToList());

    }

答案 2 :(得分:0)

每次循环执行或迭代时,它都会在此行声明一个新变量:

var LoginDetails = ....

相反,您需要连接结果,以便每次迭代循环时都不会覆盖您的数据:

List<DataRow> LoginDetails = new List<DataRow>(); //Replace T with your entity
for (int f = 0; f < pro.Length; f++)
    {
        LoginDetails = LoginDetails.Concat(dttoexcel.Rows
                     .Cast<DataRow>()
                     .Where(r => r.Field<string>("Subcategoryname") == 
                      pro[f]).ToList()).ToList();
    }

答案 3 :(得分:0)

只需复制DataRowList的引用,即可防止覆盖其内容。因此,应该克隆现有的DataRow个对象(有关详细信息,请参阅this question)。您还可以使用HashSet来改进过滤:

DataTable dttoexcel = null;
string[] pro = { "Az", "Bz", "X" };
var proSet = new HashSet<string>(pro);

// Storage for copied data. Copy metadata from the original table
DataTable dttoexcelOld = dttoexcel.Clone();

foreach (var row in dttoexcel.Rows
    .Cast<DataRow>()
    .Where(r => proSet.Contains(r.Field<string>("Subcategoryname"))))
    // Clone the row to prevent further overwriting and add it to dttoexcelOld table
    dttoexcelOld.ImportRow(row);