根据列字段删除重复项并修改它
Removing duplicates based on column field and modify it
假设我们有以下 List/IEnumerable
Program : CPE, ECE
旧列表:
Name Assigned_Area Program
Ivan Matala Mathematics CPE
Ivan Matala Mathematics ECE
Jeremy Cruz Science ECE
Ivan Matala Science CPE
NJ Aquino Engineering CPE
MJ Catanaoan Engineering ECE
新列表:
Name Assigned_Area Program
Ivan Matala Mathematics All Programs
Jeremy Cruz Science ECE
Ivan Matala Science CPE
NJ Aquino Engineering CPE
MJ Catanaoan Engineering ECE
基本上,我想做的是合并每条 'Name' 和 'Assigned_Area' 字段相同的记录,如果每条记录都有两个程序(在我们的例子中:'CPE' 和 'ECE'),那么它应该只是折叠成一行,其 Program 现在是 'All Programs'.
我们如何使用 LINQ 来实现?
到目前为止我试过的是以下不完整的代码
var newlist = oldlist.GroupBy(x => x.Assigned_Area);
基本上,我正在考虑将那些具有相同分配区域的记录分组,但是上面的代码是不完整的,因为它只考虑了一个字段(我需要考虑 2 个字段,它们是 'Name' 和 'Assigned_Area'),然后,如果每个分组的计数为 2,我将计数,如果它的计数为 2,那么我会将其折叠为一条记录,并将程序替换为 'All Programs' .
跟进问题但与上述问题有关..
以上问题适用于非匿名类。基本上,我真正的问题是,我有以下代码
public IEnumerable GetOfficialList(int visitID)
{
db = new PACUCOADB5Entities();
var x = (from a in db.Accreditor_Program
orderby a.Accreditor.Given_Name, a.Accreditor.Middle_Initial, a.Accreditor.Surname, a.Assigned_Area, a.Program.Requested_Program ascending
where a.Program.Visit.VisitID == visitID
select new
{
a.Accreditor.Title,
a.Accreditor.Given_Name,
a.Accreditor.Middle_Initial,
a.Accreditor.Surname,
a.Assigned_Area,
a.Program.Requested_Program
}).ToList();
return x
}
如您所见,'x' 是我的 list/IEnumerable,我正在尝试将相同的概念应用到我正在处理的代码中...基本上,我想做同样的事情,但是我尝试使用以下代码未成功
var newx = x.GroupBy(xx => new {xx.Title,xx.Given_Name,xx.Middle_Initial,xx.Surname,xx.Assigned_Area})
.Select(xx => new {xx.Key.Title, xx.Key.Given_Name, xx.Key.Middle_Initial, xx.Key.Surname, xx.Key.Assigned_Area, xx.Count() == 2 ? "All Programs" :x.First(y => y.Title == xx.Key.Title && y.Given_Name == xx.Key.Given_Name && y.Middle_Initial == xx.Key.Middle_Initial && y.Surname == xx.Key.Surname && y.Assigned_Area == xx.Key.Assigned_Area).Requested_Program));
但 Intellisense 通过我的错误
我们如何解决它?给定该代码,我们如何删除重复项。谢谢
可能有更好的方法,但这是我的尝试:
Person[] r = list.GroupBy(p => new { p.Name, p.AssignedArea })
.Select(g => g.ToArray())
.Select(g => g.Length > 1
UpdateProgram(g.First()) :
g.First())
.ToArray();
private static Person UpdateProgram(Person p)
{
p.Program = "All Programs";
return p;
}
但就我个人而言,我会使用分组表达式和常规 foreach 循环:
foreach (var g in list.GroupBy(p => new { p.Name, p.AssignedArea }))
{
var p = g.First();
if (g.Count() > 1)
{
p.Program = "All Programs";
}
yield return p;
}
oldList.GroupBy(x => new { x.Name, x.AssignedArea })
.Select(g => g.Count() == 1
? new Entity(g.Key.Name, g.Key.AssignedArea, g.Single().Program)
: new Entity(g.Key.Name, g.Key.AssignedArea, "All programs")
);
此处 Entity
是您的 class,其中包含 Name
、AssignedArea
和 Program
字段(您的代码中没有它的名称)。所有这些都将假设程序的数量可能是 1 或 2
这会起作用:
var result = v.GroupBy(x => new { x.Name, x.Assigned_Area})
.Select(x => new EntityName(x.Key.Name,
x.Key.Assigned_Area,
x.Count() == 2 ? "All Programs" :v.First(y => y.Name == x.Key.Name && y.Assigned_Area== x.Key.Assigned_Area).Program) );
我从字面上接受了 Mark Shevchenko 的答案并更新了考虑具有相同名称、AsisgnedArea 和程序的多行:
list
.GroupBy(x => new { x.Name, x.Area })
.Select(g =>
g.Select(x=>x.Programs).Distinct().Count() == 1 ?
new Data {Name=g.Key.Name, Area=g.Key.Area, Programs=g.First().Programs} :
new Data {Name=g.Key.Name, Area=g.Key.Area, Programs="All programs"});
您可以使用以下方法进行测试:
public struct Data
{
public string Name;
public string Area;
public String Programs;
}
void Main()
{
var list= new List<Data>()
{
new Data(){ Name="Ivan Matala", Area = "Mathematics", Programs = "CPE" },
new Data(){ Name="Ivan Matala", Area = "Mathematics", Programs = "ECE" },
new Data(){ Name="Jeremy Cruz", Area = "Science", Programs = "ECE" },
new Data(){ Name="Ivan Matala", Area = "Science", Programs = "CPE" },
new Data(){ Name="NJ Aquino", Area = "Engineering", Programs = "CPE" },
new Data(){ Name="MJ Catanaoan", Area = "Engineering", Programs = "ECE" },
new Data(){ Name="MJ Catanaoan", Area = "Science", Programs = "CPE" },
new Data(){ Name="MJ Catanaoan", Area = "Science", Programs = "CPE" }
};
}
假设我们有以下 List/IEnumerable
Program : CPE, ECE
旧列表:
Name Assigned_Area Program
Ivan Matala Mathematics CPE
Ivan Matala Mathematics ECE
Jeremy Cruz Science ECE
Ivan Matala Science CPE
NJ Aquino Engineering CPE
MJ Catanaoan Engineering ECE
新列表:
Name Assigned_Area Program
Ivan Matala Mathematics All Programs
Jeremy Cruz Science ECE
Ivan Matala Science CPE
NJ Aquino Engineering CPE
MJ Catanaoan Engineering ECE
基本上,我想做的是合并每条 'Name' 和 'Assigned_Area' 字段相同的记录,如果每条记录都有两个程序(在我们的例子中:'CPE' 和 'ECE'),那么它应该只是折叠成一行,其 Program 现在是 'All Programs'.
我们如何使用 LINQ 来实现?
到目前为止我试过的是以下不完整的代码
var newlist = oldlist.GroupBy(x => x.Assigned_Area);
基本上,我正在考虑将那些具有相同分配区域的记录分组,但是上面的代码是不完整的,因为它只考虑了一个字段(我需要考虑 2 个字段,它们是 'Name' 和 'Assigned_Area'),然后,如果每个分组的计数为 2,我将计数,如果它的计数为 2,那么我会将其折叠为一条记录,并将程序替换为 'All Programs' .
跟进问题但与上述问题有关..
以上问题适用于非匿名类。基本上,我真正的问题是,我有以下代码
public IEnumerable GetOfficialList(int visitID)
{
db = new PACUCOADB5Entities();
var x = (from a in db.Accreditor_Program
orderby a.Accreditor.Given_Name, a.Accreditor.Middle_Initial, a.Accreditor.Surname, a.Assigned_Area, a.Program.Requested_Program ascending
where a.Program.Visit.VisitID == visitID
select new
{
a.Accreditor.Title,
a.Accreditor.Given_Name,
a.Accreditor.Middle_Initial,
a.Accreditor.Surname,
a.Assigned_Area,
a.Program.Requested_Program
}).ToList();
return x
}
如您所见,'x' 是我的 list/IEnumerable,我正在尝试将相同的概念应用到我正在处理的代码中...基本上,我想做同样的事情,但是我尝试使用以下代码未成功
var newx = x.GroupBy(xx => new {xx.Title,xx.Given_Name,xx.Middle_Initial,xx.Surname,xx.Assigned_Area})
.Select(xx => new {xx.Key.Title, xx.Key.Given_Name, xx.Key.Middle_Initial, xx.Key.Surname, xx.Key.Assigned_Area, xx.Count() == 2 ? "All Programs" :x.First(y => y.Title == xx.Key.Title && y.Given_Name == xx.Key.Given_Name && y.Middle_Initial == xx.Key.Middle_Initial && y.Surname == xx.Key.Surname && y.Assigned_Area == xx.Key.Assigned_Area).Requested_Program));
但 Intellisense 通过我的错误
我们如何解决它?给定该代码,我们如何删除重复项。谢谢
可能有更好的方法,但这是我的尝试:
Person[] r = list.GroupBy(p => new { p.Name, p.AssignedArea })
.Select(g => g.ToArray())
.Select(g => g.Length > 1
UpdateProgram(g.First()) :
g.First())
.ToArray();
private static Person UpdateProgram(Person p)
{
p.Program = "All Programs";
return p;
}
但就我个人而言,我会使用分组表达式和常规 foreach 循环:
foreach (var g in list.GroupBy(p => new { p.Name, p.AssignedArea }))
{
var p = g.First();
if (g.Count() > 1)
{
p.Program = "All Programs";
}
yield return p;
}
oldList.GroupBy(x => new { x.Name, x.AssignedArea })
.Select(g => g.Count() == 1
? new Entity(g.Key.Name, g.Key.AssignedArea, g.Single().Program)
: new Entity(g.Key.Name, g.Key.AssignedArea, "All programs")
);
此处 Entity
是您的 class,其中包含 Name
、AssignedArea
和 Program
字段(您的代码中没有它的名称)。所有这些都将假设程序的数量可能是 1 或 2
这会起作用:
var result = v.GroupBy(x => new { x.Name, x.Assigned_Area})
.Select(x => new EntityName(x.Key.Name,
x.Key.Assigned_Area,
x.Count() == 2 ? "All Programs" :v.First(y => y.Name == x.Key.Name && y.Assigned_Area== x.Key.Assigned_Area).Program) );
我从字面上接受了 Mark Shevchenko 的答案并更新了考虑具有相同名称、AsisgnedArea 和程序的多行:
list
.GroupBy(x => new { x.Name, x.Area })
.Select(g =>
g.Select(x=>x.Programs).Distinct().Count() == 1 ?
new Data {Name=g.Key.Name, Area=g.Key.Area, Programs=g.First().Programs} :
new Data {Name=g.Key.Name, Area=g.Key.Area, Programs="All programs"});
您可以使用以下方法进行测试:
public struct Data
{
public string Name;
public string Area;
public String Programs;
}
void Main()
{
var list= new List<Data>()
{
new Data(){ Name="Ivan Matala", Area = "Mathematics", Programs = "CPE" },
new Data(){ Name="Ivan Matala", Area = "Mathematics", Programs = "ECE" },
new Data(){ Name="Jeremy Cruz", Area = "Science", Programs = "ECE" },
new Data(){ Name="Ivan Matala", Area = "Science", Programs = "CPE" },
new Data(){ Name="NJ Aquino", Area = "Engineering", Programs = "CPE" },
new Data(){ Name="MJ Catanaoan", Area = "Engineering", Programs = "ECE" },
new Data(){ Name="MJ Catanaoan", Area = "Science", Programs = "CPE" },
new Data(){ Name="MJ Catanaoan", Area = "Science", Programs = "CPE" }
};
}