2017-02-17 59 views
3

我正在分析和制作windows服务应用程序。如何使用列表AddRange删除重复值? C#

当我做插入查询,我添加列使用List<SqlParameter>和AddRange。

List<SqlParameter> pmlist = new List<SqlParameter>(keys);行中,它包含{@DeptCode}。

然后pmlist.AddRange(pms);行,添加了pms参数。

总线我前面提到pmslist已经{@DeptCode},所以pmlist有这样

pmlist = [0] {@DeptCode} [1] {@DeptCode} [2] {@DeptName} 
[3] {@ParentDeptName} [4] {@ParentDeptCode} [5] {@DeptLevel} 

一个DEPTCODE值被复制。所以,它试图向ShadowDeptTable插入查询,它也有5列,发生了Sql异常。

如何删除或不重复值?请帮我...

代码在下面。

//table : ShadowDeptTable , keys = {@DeptCode}, 
//pms = [0] {@DeptCode} [1] {@DeptName} [2] {@ParentDeptName} 
//  [3] {@ParentDeptCode} [4] {@DeptLevel}  

public static int InsertOrUpdate(string table, SqlParameter[] keys, params SqlParameter[] pms) 
{ 
    int st = 0; 
    string constr = Util.GetPropVal(Words.PropConnectionString); 
    var obj = SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString(),keys); 
    StringBuilder sb=new StringBuilder(); 
    sb = sb.Append("insert into " + table + "("); 
    //columns 
    string cols = null; 
    //values 
    string vals = null; 
    List<SqlParameter> pmlist = new List<SqlParameter>(keys); 
    pmlist.AddRange(pms); 
    cols = string.Join(",", pmlist.Select(a => "["+a.ParameterName.Substring(1, a.ParameterName.Length-1)+"]")); 
    vals = string.Join(",", pmlist.Select(a => "'" + a.Value + "'")); 
    sb = sb.Append(cols); 
    sb = sb.Append(") values("); 
    sb = sb.Append(vals); 
    sb = sb.Append(")"); 
    obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString()); 
    return Convert.ToInt32(obj); 
} 

回答

3

我没有深入了解您的代码。假设我们只是在讨论删除重复项。

如果你想删除的参数名称重复,也许你可以试试这个:

var merged = keys.Union(pms).GroupBy(p => p.ParameterName).Select(e => e.First()); 

它将由参数名称合并两个数组,组,然后选择从每个组中的第一项。

+0

感谢kat1330。它运作良好!这是非常有用的建议。 :) –

0

尝试使用Except

List<SqlParameter> newPms = pms.Except(pmlist).ToList(); 
pmlist.AddRange(newPms); 
+0

谢谢您的建议GSP! –

+0

不确定这将适用于没有实施比较器的情况。 'Except()'使用默认比较器,'SqlParameter'是引用类型。如果对象没有相同的引用方法,即使它们保持相同的值,它们也会被视为不同。 – kat1330