如何在数据表中选择不同的行并将其存储到数组中


167

我有一个数据集objds。objds包含一个名为Table1的表。表1包含名为ProcessName的列。这个ProcessName包含重复的名称。所以我只想选择不同的名称。

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

从下面的注释中发布示例代码,答案似乎取决于您正在使用的查询的细节。
马修马丁

Answers:


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


如果我有2列“ mo”和“ name”,我需要获取不同的“ mo”而不是不同的“ name”,但是我需要在数据表中保留“ name”列,我该怎么办?
User7291 2013年

1
@JocelyneElKhoury,那真的没有道理……您将保留哪个“ name”值?
Thomas Levesque 2013年

@ThomasLevesque哪一个都没关系...假设我需要保留名称的第一个值
User7291 2013年

17
好的,那么您需要分组,而不是不同。您可以使用Linq to DataSet来做到这一点:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque 2013年

148

单行代码将避免a的重复行DataTable

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

哪里:

  • in ToTable()中的第一个参数是一个布尔值,它指示您是否要使用不同的行。

  • 中的第二个参数ToTable()是列名,我们必须根据该列名选择不同的行。仅这些列将在返回的数据表中。

可以DataSet通过访问特定对象,从中进行以下操作DataTable

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

5
我最喜欢这个答案,因为它指向的DefaultView属性DataTable
伊恩·博伊德

如果我需要根据两列来区分,该怎么办?
LCJ

1
@Lijo,该ToTable(boolean, params string[] columnNames)方法允许指定多个列。
克里斯汀·哈马克

57
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();

30

使用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); }


13
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 2013年

当您只有List <DataRow>时,可以执行以下操作:var test =(从vm.LiveAssets中的DataRow dRow选择dRow [“ manname”])。Distinct();
pat capozzi 2013年

第一行有效。正如Urik指出的那样,第二种方法并不适用,但是Urik的方法也不起作用,因为Distinct()在对匿名类型进行对象比较时将找不到相等。
艾伦·巴尔吉

9

要改善上述答案:dataview上的ToTable函数具有“ distinct”标志。

//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);

1
这似乎不起作用。只有一个重载,其中有一个不同的布尔参数,并且它需要参数数组。我认为这只会返回一个名为“ True”的表,而不会应用任何DISTINCT。
10:15

2
+1这确实有效(至少在.NET 4.5中)。如果将布尔值“ True”指定为唯一参数,则它将对DataView中的所有列执行DISTINCT。
SetFreeByTruth

4

以下作品。我在.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);

3

我刚发现:http : //support.microsoft.com/default.aspx?scid=kb;zh-cn;326176#1

寻找类似的东西时,仅适用于.net 2.0

我假设OP在使用DataTable.Select()时正在寻找不同的对象。(Select()不支持distinct)

所以这是上面链接的代码:

class DataTableHelper 
{
    public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName)
    {   
        DataTable dt = new DataTable(TableName);
        dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);

        object LastValue = null; 
        foreach (DataRow dr in SourceTable.Select("", FieldName))
        {
            if (  LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) ) 
            {
                LastValue = dr[FieldName]; 
                dt.Rows.Add(new object[]{LastValue});
            }
        }

        return dt;
    }

    private bool ColumnEqual(object A, object B)
    {

        // Compares two values to see if they are equal. Also compares DBNULL.Value.
        // Note: If your DataTable contains object fields, then you must extend this
        // function to handle them in a meaningful way if you intend to group on them.

        if ( A == DBNull.Value && B == DBNull.Value ) //  both are DBNull.Value
            return true; 
        if ( A == DBNull.Value || B == DBNull.Value ) //  only one is DBNull.Value
            return false; 
        return ( A.Equals(B) );  // value type standard comparison
    }
}

2
string[] TobeDistinct = {"Name","City","State"};
DataTable dtDistinct = GetDistinctRecords(DTwithDuplicate, TobeDistinct);

//Following function will return Distinct records for Name, City and State column.
public static DataTable GetDistinctRecords(DataTable dt, string[] Columns)
{
    DataTable dtUniqRecords = new DataTable();
    dtUniqRecords = dt.DefaultView.ToTable(true, Columns);
    return dtUniqRecords;
}

2

句法:-

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

例如:-

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

2

最简单的解决方案是使用LINQ,然后将结果转换为DataTable

    //data is a DataTable that you want to change
    DataTable result = data.AsEnumerable().Distinct().CopyToDataTable < DataRow > ();

这仅对asp.net 4.0 ^ Framework有效,并且需要引用 Ivan Ferrer Villa指出的System.Data.DataSetExtensions。


1
也许它需要参考System.Data.DataSetExtensions
Ivan Ferrer Villa

1
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();

1
DataTable dt = new DataTable("EMPLOYEE_LIST");

DataColumn eeCode = dt.Columns.Add("EMPLOYEE_CODE", typeof(String));
DataColumn taxYear = dt.Columns.Add("TAX_YEAR", typeof(String));
DataColumn intData = dt.Columns.Add("INT_DATA", typeof(int));
DataColumn textData = dt.Columns.Add("TEXT_DATA", typeof(String));

dt.PrimaryKey = new DataColumn[] { eeCode, taxYear };

它将带有eecode和taxyear的数据表组合起来视为唯一的数据表


0

这很容易

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

和dt2数据表包含column1,Column2..ColumnNth唯一数据。


0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();

@GálGyula,您好,欢迎来到Stack Overflow!在这里,我们关心的是带有良好解释的答案,而不仅仅是代码。仅在确实解决问题后才能发布答案,并且您可以解释如何解决。为了改善您将来的答案,请查看指南如何编写一个好的答案
Erick Petrucelli

-1

像什么?

SELECT DISTINCT .... FROM表在哪里条件

http://www.felixgers.de/teaching/sql/sql_distinct.html

注意:家庭作业有问题吗?和上帝保佑谷歌..

http://www.google.com/search?hl=zh_CN&rlz=1C1GGLS_enJO330JO333&q=c%23+selecting+distinct+values+from+table&aq=f&oq=&aqi=


3
拒绝我的人:S,很明显,在我回答之后,这个问题就被修改了?(答案10:15,问题已于12:15修改)哦..谢谢您的无知:)
Madi D.

2
OP询问如何在C#ado.net环境中而不是在实际数据库中选择不同的行。
aggaton

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.