如何在DataTable中选择不同的行并存储到数组中

189

我有一个数据集objds,它包含名为Table1的表。 Table1包含名为ProcessName的列。这个ProcessName包含重复的名称。所以我想只选择不同的名称。是否可能?

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());

从您下面的评论中可以看出,答案取决于您正在处理的查询的具体细节。请发布示例代码。 - MatthewMartin
18个回答

387
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);

如果我有两列“mo”和“name”,我需要获取不同的“mo”,但不是不同的“name”,但我需要在我的数据表中保留“name”列,我该怎么办? - User7291
1
@JocelyneElKhoury,这并不太合理...那么你将保留“name”的哪个值呢? - Thomas Levesque
@ThomasLevesque 不管哪一个...假设我需要保留名称的第一个值。 - User7291
20
好的,那么你需要进行分组,而不是去重。你可以使用 Linq to DataSet 来完成:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable() - Thomas Levesque
您,先生,真棒! - Alex
显示剩余2条评论

172

以下单行代码可避免DataTable中的重复行:

dataTable.DefaultView.ToTable(true, "employeeid");

其中:

  • ToTable()方法的第一个参数是一个布尔值,指示是否要获取唯一(不重复)的行。

  • ToTable()方法的第二个参数是根据哪一列选择唯一行时需要保留的列名。仅这些列将包含在返回的数据表中。

同样可以从 DataSet 中通过访问特定的 DataTable 来实现。

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");

6
我最喜欢这个答案,因为它指向了一个DataTableDefaultView属性。 - Ian Boyd
如果我需要根据两列获取不同的数据怎么办? - LCJ
1
@Lijo,ToTable(boolean, params string[] columnNames) 方法允许指定多个列。 - Kristen Hammack
这是魔法,甚至不确定它是如何工作的。救了我的命。 - ransems
这真是神奇,我甚至不确定它是如何工作的。真是救了我的命。 - undefined

64
DataTable dt = new DataTable();
dt.Columns.Add("IntValue", typeof(int));
dt.Columns.Add("StringValue", typeof(string));
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(2, "2");
dt.Rows.Add(2, "2");

var x = (from r in dt.AsEnumerable()
        select r["IntValue"]).Distinct().ToList();

36

使用LINQ (.NET 3.5, C# 3)

var distinctNames = ( from row in DataTable.AsEnumerable()
 select row.Field<string>("Name")).Distinct();

 foreach (var name in distinctNames ) { Console.WriteLine(name); }

19

第二个答案非常快! - Merin Nakarmi

15
var distinctRows = (from DataRow dRow in dtInventory.Rows
                                select dRow["column_name"] ).Distinct();

var distinctRows = (from DataRow dRow in dtInventory.Rows
                                select dRow["col1"], dRow["col2"].. ).Distinct();

@Adi Lester:也许选择 new { col1 = dRow["col1"], col2 = dRow["col2"], ...} ).Distinct(); 更加正确? - Urik
当你只有一个List<DataRow>时,你可以这样做:var test = (from DataRow dRow in vm.LiveAssets select dRow["manname"]).Distinct(); - pat capozzi
第一行有效。第二行,正如 Urik 指出的那样不起作用, 但是Urik的也不起作用,因为Distinct()在对匿名类型进行对象比较时不会找到相等性。 - Alan Baljeu

10
为了改进上述答案:dataview 上的 ToTable 函数有一个“distinct”标志。
//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);

1
这好像不起作用。它只有一个带有明确布尔参数的重载,并且需要参数数组。我认为这只会返回一个名为“True”的表,没有任何应用于其中的DISTINCT。 - proudgeekdad
2
+1 这实际上是有效的(至少在.NET 4.5中)。如果您将布尔值“True”指定为唯一参数,则会对DataView中的所有列执行DISTINCT操作。 - SetFreeByTruth
如果您想对所有列使用DISTINCT,则此方法完美适用。 - Merin Nakarmi

5
以下内容有效。我已经在使用.NET 3.5 SP1中使其工作。
// Create the list of columns
String[] szColumns = new String[data.Columns.Count];
for (int index = 0; index < data.Columns.Count; index++)
{
    szColumns[index] = data.Columns[index].ColumnName;
}

// Get the distinct records
data = data.DefaultView.ToTable(true, szColumns);

5

语法:

DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName");

EX:-

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");

3

这很容易

    DataView view = new DataView(dt);
DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");

同时,dt1和dt2数据表中的Column1、Column2...ColumnNth列中包含唯一数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接