Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从DataTable中使用Linq查找重复记录_Linq_Datatable - Fatal编程技术网

如何从DataTable中使用Linq查找重复记录

如何从DataTable中使用Linq查找重复记录,linq,datatable,Linq,Datatable,这是我的数据表 DataTable dt = new DataTable(); dt.Rows.Add(2,Test1,Sample1); dt.Rows.Add(2,Test2,Sample2); dt.Rows.Add(4,Test3,Sample3); dt.Rows.Add(4,Test4,Sample4); dt.Rows.Add(2,Test5,Sample5); 我想显示第4类存在重复记录的消息 通过比较使用两个循环是可能的,但是我想要一个优化的代码,它将返回我重复的记录,我将显

这是我的数据表

DataTable dt = new DataTable();
dt.Rows.Add(2,Test1,Sample1);
dt.Rows.Add(2,Test2,Sample2);
dt.Rows.Add(4,Test3,Sample3);
dt.Rows.Add(4,Test4,Sample4);
dt.Rows.Add(2,Test5,Sample5);
我想显示第4类存在重复记录的消息
通过比较使用两个循环是可能的,但是我想要一个优化的代码,它将返回我重复的记录,我将显示一条消息。如果任何主体都知道请共享..,则代码可能使用Linq?

假设当两行或更多行的第一列值相同时,您会得到一条重复记录:

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1);
以下是一个例子:

DataTable dt = new DataTable();
dt.Columns.Add();
dt.Columns.Add();
dt.Columns.Add();
dt.Rows.Add(1, "Test1", "Sample1");
dt.Rows.Add(2, "Test2", "Sample2");
dt.Rows.Add(3, "Test3", "Sample3");
dt.Rows.Add(4, "Test4", "Sample4");
dt.Rows.Add(5, "Test5", "Sample5");

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList();
Console.WriteLine("Duplicate found: {0}", duplicates.Any());

dt.Rows.Add(1, "Test6", "Sample6");  // Duplicate on 1
dt.Rows.Add(1, "Test6", "Sample6");  // Duplicate on 1
dt.Rows.Add(3, "Test6", "Sample6");  // Duplicate on 3
dt.Rows.Add(5, "Test6", "Sample6");  // Duplicate on 5

duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList();
if (duplicates.Any())
    Console.WriteLine("Duplicate found for Classes: {0}", String.Join(", ", duplicates.Select(dupl => dupl.Key)));

Console.ReadLine();

您可以获得两个LINQ查询或结果的交集。 Intersect意味着在两个LINQ结果之间查找公共记录

下面是一个例子

    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    DataColumn dc;
    DataRow dr;
    ds.DataSetName = "products";
    dt.TableName = "product";

    dc = new DataColumn("product_id",long.MaxValue.GetType());
    dt.Columns.Add(dc);

    dc = new DataColumn("product_name");
    dt.Columns.Add(dc);

    dr = dt.NewRow();
    dr["product_id"] = 1;
    dr["product_name"] = "Monitor";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 2;
    dr["product_name"] = "Mouse";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 3;
    dr["product_name"] = "KeyBoard";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 4;
    dr["product_name"] = "LCD";
    dt.Rows.Add(dr);

    ds.Tables.Add(dt);

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable()
                                   where tbl.Field<long>(0) >=3
                                   select tbl;



    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable()
                                   let product_name = tbl.Field<string>(1)
                                   where product_name.StartsWith("Key")
                                   || product_name.StartsWith("Mo")
                                   select tbl;




    IEnumerable<DataRow> objUnionResult = objResult1.Intersect(objResult2);

    Response.Write("<br/><br/><b>Intersect Query Results</b>");
    foreach (DataRow row in objUnionResult)
    {
        Response.Write(string.Format("<br/>Product ID: {0} ,  Product Name: {1}", row.Field<long>(0), row.Field<string>(1)));
    }
    Response.Write("<br/><br/>");
DataSet ds=新数据集();
DataTable dt=新的DataTable();
数据列dc;
数据行dr;
ds.DataSetName=“产品”;
dt.TableName=“产品”;
dc=新的数据列(“product_id”,long.MaxValue.GetType());
dt.Columns.Add(dc);
dc=新数据列(“产品名称”);
dt.Columns.Add(dc);
dr=dt.NewRow();
dr[“产品标识”]=1;
dr[“产品名称”]=“监视器”;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr[“产品标识”]=2;
dr[“产品名称”]=“鼠标”;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr[“产品标识”]=3;
dr[“产品名称”]=“键盘”;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr[“产品标识”]=4;
dr[“产品名称”]=“液晶显示器”;
dt.Rows.Add(dr);
ds.Tables.Add(dt);
IEnumerable objResult1=来自dt.AsEnumerable()中的tbl
其中tbl.字段(0)>=3
选择tbl;
IEnumerable objResult2=来自ds.Tables[0]中的tbl。AsEnumerable()
让产品名称=待定字段(1)
其中product_name.StartsWith(“键”)
||产品名称。开始使用(“Mo”)
选择tbl;
IEnumerable objUnionResult=objResult1.Intersect(objResult2);
Write(“

相交查询结果”); foreach(objUnionResult中的数据行) { Write(string.Format(“
产品ID:{0},产品名称:{1}”,row.Field(0),row.Field(1)); } 响应。写(“

”);
什么是“4级”?何时有重复项?如果缺少AsEnumerable(),请添加对System.Data.DataTableExtensions的引用