gpt4 book ai didi

c# - 比较两个集合列表

转载 作者:行者123 更新时间:2023-11-30 15:48:23 25 4
gpt4 key购买 nike

我已经处理这个问题几个小时了,但似乎找不到解决方案。我有 2 个 list ,一个是电子表格,另一个是数据表。我需要将电子表格与数据表进行匹配,以确定我是否缺少库存。电子表格应该与我在数据库中的内容相匹配,即电子表格就像一个母版,所以当我在数据库中缺少库存时,我需要将它添加到一个列表并构建一个报告。

我认为通过循环遍历电子表格并针对电子表格中的每个库存循环遍历数据表可以实现我的目标,但事实证明这是错误的。我有什么想法可以做到这一点吗?

谢谢,埃里克

方法如下:

public void Reconcile()
{
ObjectDataSource ods = new ObjectDataSource();
ods.ID = "ods";
ods.TypeName = "";
ods.SelectMethod = "GetAssets";
ods.TypeName = "dsAssetsTableAdapters.AssetsTableAdapter";
ods.SelectParameters.Clear();

ReportDataSource rds = new ReportDataSource("dsAssets_Assets", ods);

reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.DataSources.Add(rds);

string _list = "";
string _list_missing_SN = "";

string filename = Server.MapPath("XLS/reconcile.xls");
string sheetname = GetExcelSheetNames(filename)[0].ToString();

String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + filename + ";" +
"Extended Properties=Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + sheetname + "]", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;
DataSet objDataset1 = new DataSet();
objAdapter1.Fill(objDataset1, "XLData");

string m_AssetManagement = System.Configuration.ConfigurationManager.ConnectionStrings["Asset_Management"].ToString();

List<string> SN_list = new List<string>();

SqlDataReader Assets_rd;
SqlCommand cmdMyAssets = new SqlCommand();
cmdMyAssets.Connection = new SqlConnection(m_AssetManagement);
cmdMyAssets.CommandType = CommandType.StoredProcedure;
cmdMyAssets.CommandText = "sp_Assets_Hardware_Select_by_Serial_Number";

try
{
cmdMyAssets.Connection.Open();
Assets_rd = cmdMyAssets.ExecuteReader();
string strString;
while (Assets_rd.Read())
{
strString = Assets_rd.GetSqlString(0).ToString().Trim() + "^" + Assets_rd.GetInt32(1).ToString().Trim() + "^" + Assets_rd.GetInt32(2).ToString().Trim();
SN_list.Add(strString);
}
}
catch (SqlException dbError)
{
Trace.Write("Database unavailable with Message: ", dbError.Message);
Trace.Write("Stack Trace: ", dbError.StackTrace);
throw;
}

bool record_match = false;
foreach (DataRow drXCL in objDataset1.Tables[0].Rows)
{
if (drXCL.ItemArray[1].ToString() != string.Empty)
{
try
{
string[] assetInfo = null;
assetInfo = SN_list[0].Split('^');
if (assetInfo[0].Contains(drXCL.ItemArray[1].ToString()))
{
_list += "|" + drXCL.ItemArray[1].ToString();
}
else
{
_list_missing_SN += drXCL.ItemArray[1].ToString().Trim() + "<br>";
}
}
catch (Exception SqlEx)
{
// Throw Sqw Exception
clAppExceptions.buildEmailNotification(SqlEx.Message.ToString());
}
}
else
{
//_list += "|*** NO SERIAL NUMBER ***";
}
}
if (_list_missing_SN != "")
{
Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "myAlert", "<script language='javascript'>alert('Following Serial Numbers were not on the spreasheet: " + _list_missing_SN + "');</script>");
}
_list += "|";

ods.SelectMethod = "GetAssetsBySerialNumbers";
ods.SelectParameters.Add("list", _list);

reportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/Asset_List.rdlc");

ReportParameter rpCategory = new ReportParameter("ReportParameter", "These assets are gone.");
ReportParameter[] _rpCategory = { rpCategory };
reportViewer1.LocalReport.SetParameters(_rpCategory);

reportViewer1.LocalReport.Refresh();
}

最佳答案

我会将主列表加载到一个数组中,并创建与第一个数组的位置相对应的第二个 bool 值数组。然后遍历数据表,当你找到元素时,将 bool 翻转为 true。如果找不到它,请将该元素存储在未找到的数组中。数据表循环完成后,您可以生成 2 个列表。第一个列表是数据表中但不在主列表中的项目……未找到的数组。第二个列表是通过遍历 bool 数组创建的,任何 false 值都意味着在数据表中找不到主列表元素。

这可以扩展到包括计数或其他应该匹配但不匹配的信息。

关于c# - 比较两个集合列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2656407/

25 4 0
文章推荐: c# - 类设计 - 从 返回列表