【问题标题】:Create a function two compare 2 arrays - one with data from csv, one with data from database创建一个函数,两个比较 2 个数组 - 一个与来自 csv 的数据,一个与来自数据库的数据
【发布时间】:2014-06-30 12:47:14
【问题描述】:

我正在尝试创建一个比较 2 个数组的结果的函数。如果它们匹配,则无需执行任何操作。如果它们不匹配,则需要对 SQL 表(称为 Products_Extension)进行 UPDATE。

数组 A 旨在包含用户上传的 .csv 文件中每个产品配置文件的 ItemsAssignedID 的逗号分隔列表(此字段在 Products_Extension 表中称为 uidProducts)。数组 B 旨在为每个产品配置文件包含来自数据库的 ItemsAssignedID 的逗号分隔列表。这两个列表都通过 ProfileID 字段附加到产品配置文件。 (我猜我需要清除数组 B 中的项目是 A 和 B 不匹配,用数组 A 中的项目填充数组 B,然后相应地更新数据库)

我有两个函数,一个为数据库中的每个产品配置文件构建 ItemsAssignedID 列表,另一个从上传的 .csv 文件中获取所有 ItemsAssignedID。但是我对如何组合它们以便比较两个数组感到困惑。

为每个产品配置文件构建以逗号分隔的 ItemsAssignedID 列表的函数:

private string BuildItemsAssignedList(int ProfileID)
{
    string assignedIdList = "";

    string sqlQuery = "SELECT [uidProducts] FROM Products_Extension WHERE uidProductProfile = @ProfileID";
    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
    {
        SqlCommand cmd = new SqlCommand(sqlQuery, cn);
        cmd.Parameters.Add(new SqlParameter("@ProfileID", ProfileID));
        cmd.CommandType = CommandType.Text;
        cn.Open();
        using (IDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                if (!String.IsNullOrEmpty(assignedIdList))
                    assignedIdList += ", ";
                assignedIdList += (reader["uidProducts"].ToString());
            }
            reader.Close();
        }
        cn.Close();
    }
    return assignedIdList = string.Join(",", assignedIdList);
}

从每个产品配置文件的 .csv 文件中拆分以逗号分隔的 ItemsAssignedID 列表的函数:

private void SaveAssignedItems(int ProfileID, string[] row)
{
    string AssignedID = GetValue(row, (int)ProfileColumns.ItemsAssignedIDs);
    AssignedID = AssignedID.ToLower();
    AssignedID.Trim();

    if (AssignedID != "")
    {
        string[] assignedids = AssignedID.Split(',');

        foreach (string item in assignedids)
        {

            int MyVal = Convert.ToInt32(item);
            using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cn;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "UPDATE Products_Extension SET uidProductProfile = @ProfileID WHERE uidProducts=@AssignedID";
                cmd.Parameters.AddWithValue("@ProfileID", ProfileID);
                cmd.Parameters.AddWithValue("@AssignedID", item);
                cn.Open();
                cmd.ExecuteNonQuery();
                cn.Close();
            }
        }
    }
}

【问题讨论】:

  • 为什么不将两个集合都存储到一个列表中,而不是连接为字符串等。如果将两者都存储为列表,那么比较列表 A 和 B 更容易。它不是最有效的,而是可行的解决方案始终是优化前最好的第一步。
  • 存储它们是什么意思?
  • 嗨@SaraDeJaneiro 请让你的句子清楚地理解它......
  • 更改assignedIdList = List 然后更改assignedIdList += (reader["uidProducts"].ToString()); toassignIdList.Add(reader["uidProducts"].ToString(); 现在你有了一个列表,你可以使用诸如 except 来查找另一个列表之间的差异。

标签: c# sql arrays csv


【解决方案1】:

据我了解,您想要compare 两个arrays 并在匹配/不匹配时执行一些操作对吗?

请尝试以下方法:

方法一

bool found= false;
int[] a = new int[] { 8, 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };
foreach (var numberA in a)
{
    foreach (var numberB in b)
    {
        if (numberA == numberB)
        {
            found= true;
        }

    }
    if(!found)
    {
          //numberA not found in array B
    }
}  

方法 2:

 int[] a = new int[] { 1, 2, 3, 4 };
 int[] b = new int[] { 1, 2, 3 };
 var result = a.Except(b).ToArray();
 foreach (var item in result)
 {
    Response.Write("\nItems not in B are :"+item);
 }

注意:请不要使用“原样”。进行相应的更改..!

【讨论】:

  • 你可以更容易地做到这一点,因为 var diff = a.Except(b);而不是所有的循环。
  • 嗨@KevinCook 我已经根据你的建议更新了我的答案:)
  • var 结果已经是一个可枚举的,所以你也可以删除 ToArray(),没有它你仍然可以 foreach(int item in result)。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多