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

C# 如何在数据表中选择不同的行并存储到数组中,c#,select,datatable,distinct,C#,Select,Datatable,Distinct,我有一个数据集objds。objds包含一个名为Table1的表。表1包含名为ProcessName的列。此ProcessName包含重复的名称。因此我只想选择不同的名称。这是否可能 intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString()); 你喜欢什么 选择不同的。。。。从何处条件表 注意:作业问题?上帝保佑谷歌 为了改进上述答案:dataview上的ToTable函数有一个独特的标志 //This will f

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

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());
你喜欢什么

选择不同的。。。。从何处条件表

注意:作业问题?上帝保佑谷歌


为了改进上述答案:dataview上的ToTable函数有一个独特的标志

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

我碰巧发现:

在寻找类似的东西时,仅限于.NET2.0

我假设OP在使用DataTable.Select时正在查找distinct。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
    }
}

以下单行代码将避免数据表中的重复行:

其中:

ToTable中的第一个参数是一个布尔值,它指示您是否需要不同的行

ToTable中的第二个参数是列名,我们必须根据它选择不同的行。返回的数据表中只有这些列

通过访问特定的数据表,可以从数据集执行相同的操作:


使用LINQ.net3.5,c3

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

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

以下作品。我用.NET3.5SP1实现了它

// 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);
您可以这样使用:

数据是数据表

但是性能会下降。请尝试使用以下代码:

data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();  
绩效考核

语法:-

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


它使用eecode和taxyear组合过滤数据表,并将其视为唯一的

最简单的解决方案是使用LINQ,然后将结果转换为数据表
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();

这是唯一有效的 对于asp.net 4.0^框架,它需要参考System.Data.DataSetExtensions,正如Ivan Ferrer Villa指出的那样,这很容易

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

和dt2 datatable包含column1、Column2..ColumnNth唯一的数据。

发布示例代码,从您在下面所做的评论来看,答案似乎取决于您正在处理的查询的具体细节。对于否决我的人:S,,显然,问题是在我的回答之后修改的??回答10:15,问题在12:15编辑好的。。thx for ur known:OP询问如何在C ado.net环境中选择不同的行,而不是在实际的数据库中。这似乎不起作用。只有一个重载包含不同的布尔参数,它需要参数数组。我想这只会返回一个名为True的表,没有任何明显的应用程序。+1这实际上至少在.NET4.5中是有效的。如果将布尔值True指定为唯一参数,它将对DataView中的所有列执行DISTINCT。我最喜欢这个答案,因为它指向DataTable的DefaultView属性。如果我需要基于两列进行DISTINCT,该怎么办?@Lijo,ToTableboolean,params字符串[]columnNames方法允许指定多个列。@Adi Lester:可以选择新的{col1=dRow[col1],col2=dRow[col2],…}.Distinct;是否更正确?当您只有一个列表时,可以执行以下操作:var test=从vm.LiveAssets中的DataRow dRow选择dRow[manname].Distinct;第一行是有效的。第二,正如Urik指出的那样,但Urik的也不起作用,因为在匿名类型上进行对象比较时,Distinct不会发现相等。如果我有两列mo和name,我需要获得Distinct mo,但不是Distinct name,但我需要在数据表中保留列名,我该怎么办?@JocelyneElKhoury,这真的没有道理。。。那么您将保留名称的哪个值?@thomaslevsque哪一个并不重要……假设我需要保留名称的第一个值OK,那么您需要分组,而不是区分。您可以使用Linq to DataSet:table.AsEnumerable.GroupByrow=>row.Fieldmo.Selectgroup=>group.First.CopyToDataTableHi@GálGyula,欢迎使用堆栈溢出!在这里,我们关心的是有良好解释的答案,而不仅仅是代码。只有当答案真的解决了问题,并且你可以解释如何解决时,才发布答案。要改进您将来的答案,请查看指南。可能它需要对System.Data.DataSetExtensions的引用
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();
data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");  
data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();  
DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName");
DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
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;
}
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 };
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
    //data is a DataTable that you want to change
    DataTable result = data.AsEnumerable().Distinct().CopyToDataTable < DataRow > ();
    DataView view = new DataView(dt);
DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();