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
C# 使用linq在数据表中保留一行几乎相同的行_C#_Linq_Datatable - Fatal编程技术网

C# 使用linq在数据表中保留一行几乎相同的行

C# 使用linq在数据表中保留一行几乎相同的行,c#,linq,datatable,C#,Linq,Datatable,我有一个datatable,其中除了一列“FileID”中的值之外,可能有几乎相同的行。可以不同的列包含Int32数据,我希望在复制行时只保留具有此列最大值的行。如果行不重复,我希望保留单行 var Test = dt.AsEnumerable() .GroupBy(r => new { Tool = r.Field<string>("Tool"),

我有一个datatable,其中除了一列“FileID”中的值之外,可能有几乎相同的行。可以不同的列包含Int32数据,我希望在复制行时只保留具有此列最大值的行。如果行不重复,我希望保留单行

var Test = dt.AsEnumerable()
                .GroupBy(r => new
                {
                    Tool = r.Field<string>("Tool"),
                    Plate = r.Field<string>("Plate"),
                    Lot = r.Field<string>("Lot"),
                    Time1 = r.Field<DateTime>("Time1"),
                    Tool2 = r.Field<string>("Tool2"),
                    Time2 = r.Field<DateTime>("Time2"),
                    Recipe = r.Field<string>("Recipe"),
                    Row = r.Field<Int16>("Row")
                }).OrderBy(t => t.Max(r => r.Field<Int32>("FileID")));
var Test=dt.AsEnumerable()
.GroupBy(r=>new
{
刀具=r.字段(“刀具”),
板=右场(“板”),
批次=r.字段(“批次”),
Time1=r.字段(“Time1”),
Tool2=r.字段(“Tool2”),
Time2=r.字段(“Time2”),
配方=r.字段(“配方”),
行=r.字段(“行”)
}).OrderBy(t=>t.Max(r=>r.Field(“FileID”));

这似乎正确地过滤了行,但我丢失了FileID列。我想把这个查询的结果放回一个具有max FileID的datatable中,这样就可以在表单的datagridview中使用它。这是怎么可能的?

按适当的列分组后,只需从每个组中选择具有max
FileID
的行,然后就可以使用
CopyToDataTable
扩展名:

var ans = dt.AsEnumerable()
            .GroupBy(r => new {
                Tool = r.Field<string>("Tool"),
                Plate = r.Field<string>("Plate"),
                Lot = r.Field<string>("Lot"),
                Time1 = r.Field<DateTime>("Time1"),
                Tool2 = r.Field<string>("Tool2"),
                Time2 = r.Field<DateTime>("Time2"),
                Recipe = r.Field<string>("Recipe"),
                Row = r.Field<Int16>("Row")
            })
            .Select(rg => rg.OrderByDescending(r => r.Field<Int32>("FileID")).First())
            .CopyToDataTable();

是否添加select子句?可能是您想要的。将
FileID
添加到“选择列”列表中。非常感谢。这很有效。我用一种不同的方式处理它,没有使用
CopyToDataTable
,在它工作的同时,它添加了很多额外的代码。这更干净了。刚才也看到了更新。每个组最多只会有几个重复的行,所以我认为应该不会有太大的变化,但我会尝试使用MaxBy来比较。
public static T MaxBy<T, TKey>(this IEnumerable<T> src, Func<T, TKey> keySelector) => src.Aggregate((a, b) => Comparer<TKey>.Default.Compare(keySelector(a), keySelector(b)) > 0 ? a : b);

var ans = dt.AsEnumerable()
            .GroupBy(r => new {
                Tool = r.Field<string>("Tool"),
                Plate = r.Field<string>("Plate"),
                Lot = r.Field<string>("Lot"),
                Time1 = r.Field<DateTime>("Time1"),
                Tool2 = r.Field<string>("Tool2"),
                Time2 = r.Field<DateTime>("Time2"),
                Recipe = r.Field<string>("Recipe"),
                Row = r.Field<Int16>("Row")
            })
            .Select(rg => rg.MaxBy(r => r.Field<Int32>("FileID")))
            .CopyToDataTable();