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();
}
每次使用新数据更新列表时,旧数据都将被覆盖。我希望将所有数据存储到列表中,而不会丢失旧数据。
请帮我解决这个问题。
答案 0 :(得分:0)
每次迭代都会创建新的LoginDetails
对象,因此您需要将过滤后的数据存储在某个位置,例如使用List
或AddRange
在同一类型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());
}
AddRange
和Concat
方法具有不同的语义:
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)
只需复制DataRow
对List
的引用,即可防止覆盖其内容。因此,应该克隆现有的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);