2017-02-17 142 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