2013-02-16 79 views
0

我有一个数据库列,每列中有多个名称用逗号分隔。我试图填充包含所有名称但没有重复的数据表。从读取器填充的阵列中删除重复项

目前该列表已填充,但重名仍然出现。

我的代码是:

while (reader.Read()) 
     { 
      string[] array = reader[0].ToString().Split(','); 
      string[] unique = array.Distinct().ToArray(); 
      foreach (string s in unique) 
       dt.Rows.Add(s); 
     } 

任何帮助将不胜感激,谢谢。

+1

您的查询的外观如何?改变查询返回Distinct Rows是不是更容易? – MethodMan 2013-02-16 18:04:27

+0

不同的源行可以包含重复的问题吗?例如,“A,B,B,C”和“A,D,D,F,F”加上A,B,C,A,D, F'(重复'A')? – dtb 2013-02-16 18:07:36

+0

不同的行可能会有多个用逗号分隔的名称,如:name1,name2,name3。但是另一列可能包含名称的副本,例如:name1,name4。名字1将被返回两次。 – user2078938 2013-02-16 18:08:29

回答

0

试试这个

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

while (reader.Read()) 
{ 
    string[] unique = reader[0].ToString().Split(',').Distinct().ToArray(); 

    foreach (string s in unique) 
     if (!distinctValues.Contains(s)) 
      distinctValues.Add(s); 
} 

foreach (string s in distinctValues) 
    dt.Rows.Add(s) 
+0

谢谢!这工作! – user2078938 2013-02-16 18:11:11

1

下面是使用CROSS APPLY数据库解决方案:

CREATE TABLE YourTable (YourColumn varchar(100)); 

INSERT INTO YourTable VALUES ('John,Jack,Jill,John'), 
('Mike,John,Jack,Jill,John'); 

SELECT DISTINCT 
    Split.a.value('.', 'VARCHAR(100)') AS UniqueName 
FROM 
    (SELECT 
    CAST ('<M>' + REPLACE(YourColumn, ',', '</M><M>') + '</M>' AS XML) AS String 
    FROM YourTable 
) AS A 
CROSS APPLY String.nodes ('/M') AS Split(a) 

可生产这些结果:

UNIQUENAME 
Jack 
Jill 
John 
Mike 

和一些示例fiddle

+0

谢谢。这个方法很好理解。我已经实现了Hossein Narimani Rad的答案,它已经在c#端更容易修复。再次感谢。 – user2078938 2013-02-16 18:18:54