在做项目时遇到要判断输入内容重复判断以及与已经存在值进行比较。如果有存在的值则进行把原来的值设置为Activate状态。
下面的代码是我写的。
if (string.IsNullOrEmpty(newValueNames) == false)
   {
    string[] temp1 = newValueNames.Split(",\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    ArrayList temp = new ArrayList();
    for (int i = 0; i < temp1.Length; i++)
    {
     if (temp.Contains(temp1[i])==false)
     {
      temp.Add(temp1[i]);
     }
    }
     
    foreach (string item in temp.ToArray())
    {
     if (item.IsNullOrEmpty(true) == false)
     {
      
      foreach (AttributeValue value in attributeValues.ToList())
      {
       if (item.Trim() == value.ValueName.Trim())
       {
        //int i=UpdateAttributeValuesStatus(attributeID, item.Trim(), value.ValueID.ToString());
        attributeValues.Remove(value);
        attributeValues.Add(new AttributeValue() { ValueName = item.Trim(), StatusID = "A", ValueID = value.ValueID, AttributeID = Int32.Parse(attributeID) });
        temp.reomve(item);
        break;
       }
      }
 
     }
     
    }
    foreach(string item in temp)
    {
     attributeValues.Add(new AttributeValue() { ValueName = item.Value, StatusID = "A" });
    }
   }
经过头修改之后的代码如下:
if (newValueNames.IsNullOrEmpty(true) == false)
   {
    string[] temp1 = newValueNames.Split(",\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    Dictionary<string, string> temp = new Dictionary<string, string>();
    // Remove duplicated names in the new value
    for (int i = 0; i < temp1.Length; i++)
    {
     if (temp1[i].IsNullOrEmpty(true) == false && temp.ContainsKey(temp1[i].Trim().ToUpper()) == false)
     {
      temp.Add(temp1[i].Trim().ToUpper(), temp1[i].Trim());
     }
    }
    // Remove duplicated names between new value and existing value. Mark existing value as Active
    foreach (KeyValuePair<string, string> item in temp.ToArray())
    {
     foreach (AttributeValue value in attributeValues.ToList())
     {
      if (string.Compare(item.Key, value.ValueName, StringComparison.InvariantCultureIgnoreCase) == 0)
      {
       value.StatusID = "A";
       temp.Remove(item.Key);
       break;
      }
     }
    }
    // Add new value to list
    foreach (KeyValuePair<string, string> item in temp)
    {
     attributeValues.Add(new AttributeValue() { ValueName = item.Value, StatusID = "A" });
    }
   }
首先考虑代码的性能最好不要使用Array和ArrayList数组。要使用泛型如List<string> temp=new List<string>();
再者在比较重复值时使用Dictionary<string, string>去判断输入值大小写不一样时也要按重复值进行处理。
判断字符类型为不为空时使用temp1[i].IsNullOrEmpty(true)去判断比用string.Empty要好用。
在我写的代码中有个bug:
attributeValues.Remove(value);
attributeValues.Add(new AttributeValue() { ValueName = item.Trim(), StatusID = "A", ValueID = value.ValueID, AttributeID = Int32.Parse(attributeID) });
因为数组中存在id是固定的,不能把原来的删了再添加,直接改原来的数据就行了。如:
value.StatusID = "A";
比较两个字符串是否相等时不要用:item.Trim() == value.ValueName.Trim()
而要使用:
string.Compare(item.Key, value.ValueName, StringComparison.InvariantCultureIgnoreCase) == 0
也就是string.Compare()方法。
当对泛型的数据进行遍历时如果是如下代码:则只能遍历不能对数据进行增删改操作。
foreach(AttributeValue value in attributeValues)
{}
如果要进行增删改操作则需要把泛型数据转化为数组进行操作:
foreach(AttributeValue value in attributeValues.ToList())
{}
很感谢头能一行一行仔细看代码并进行修改。让我学习到不少的东西。