C# C.NET LinQ通过扭曲从列表中删除重复项
我有一个公司对象列表,包括名称、地址、电子邮件等。我需要一种按公司名称对列表进行排序的方法,我可以轻松做到这一点。但是我需要比较电子邮件和城市。如果其中一个与同名公司匹配,我需要同时删除它们 我可以很容易地做。首先得到一个和删除匹配的一个,但我需要从列表中删除原始的。有道理? 下面的2条LINQ语句删除了重复项,但没有删除原始项C# C.NET LinQ通过扭曲从列表中删除重复项,c#,linq,C#,Linq,我有一个公司对象列表,包括名称、地址、电子邮件等。我需要一种按公司名称对列表进行排序的方法,我可以轻松做到这一点。但是我需要比较电子邮件和城市。如果其中一个与同名公司匹配,我需要同时删除它们 我可以很容易地做。首先得到一个和删除匹配的一个,但我需要从列表中删除原始的。有道理? 下面的2条LINQ语句删除了重复项,但没有删除原始项 for (int i = 2; i <= 10749; i++) //Range.UsedRange isnt working for some reason s
for (int i = 2; i <= 10749; i++) //Range.UsedRange isnt working for some reason so I hard coded the row numbers
{
firm = new Firm();
string begCell;
begCell = "B" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.acctNo = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "C" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.name = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "D" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.addy1 = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "E" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.city = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "F" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.state = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "G" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.zip = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "H" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.phone = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "I" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
firm.email = fixNullValues(Convert.ToString(excelCell.Value2));
begCell = "AB" + i;
excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell);
if (Convert.ToString(excelCell.Value2).Equals("Active", StringComparison.OrdinalIgnoreCase))
firm.active = true;
if (firm.active)
firmList.Add(firm);
}
var sortedList = firmList.OrderBy(o => o.name).ToList();
var removeDupEmails = firmList.GroupBy(x => x.name).SelectMany(x =>
x.OrderByDescending(y => y.email)
.Take(1)
);
var removeDupZips = firmList.GroupBy(x => x.name).SelectMany(x =>
x.OrderByDescending(y => y.addy)
.Take(1)
);
我想这会管用的。不只是删除,而是只添加符合条件的。我更新了代码。发现了一些错误
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
List<Company> companies = new List<Company>();
var groups = companies.AsEnumerable().GroupBy(x => x.name)
.Select(x => x.Where(y => (x.Select(z => z.email).ToList().Where(s => s == y.email).Count() == 1) && (x.Select(z => z.addy).ToList().Where(s => s == y.addy).Count() == 1)).Select(a => a)).SelectMany(b => b).ToList();
}
}
public class Company
{
public string name {get;set;}
public string email {get;set;}
public string addy {get;set;}
}
我想这会管用的。不只是删除,而是只添加符合条件的。我更新了代码。发现了一些错误
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
List<Company> companies = new List<Company>();
var groups = companies.AsEnumerable().GroupBy(x => x.name)
.Select(x => x.Where(y => (x.Select(z => z.email).ToList().Where(s => s == y.email).Count() == 1) && (x.Select(z => z.addy).ToList().Where(s => s == y.addy).Count() == 1)).Select(a => a)).SelectMany(b => b).ToList();
}
}
public class Company
{
public string name {get;set;}
public string email {get;set;}
public string addy {get;set;}
}
要消除重复项,可以使用以下模式:
source.GroupBy(element => element.Property) // Split the list in groups by the property you want to check
.Where(propertyGroup => propertyGroup.Count() > 1) // Filter the duplicates
.SelectMany(propertyGroup => propertyGroup) // Flatten back the result set
如果我正确理解了具体问题,您可以通过以下单个查询获得所需的结果:
var resultList = firmList
.GroupBy(firm => firm.name)
.OrderBy(nameGroup => nameGroup.Key)
.SelectMany(nameGroup => nameGroup
.GroupBy(firm => firm.email)
.Where(emailGroup => emailGroup.Count() > 1)
.SelectMany(emailGroup => emailGroup)
.GroupBy(firm => firm.addy)
.Where(addyGroup => addyGroup.Count() > 1)
.SelectMany(addyGroup => addyGroup)
)
.ToList();
要消除重复项,可以使用以下模式:
source.GroupBy(element => element.Property) // Split the list in groups by the property you want to check
.Where(propertyGroup => propertyGroup.Count() > 1) // Filter the duplicates
.SelectMany(propertyGroup => propertyGroup) // Flatten back the result set
如果我正确理解了具体问题,您可以通过以下单个查询获得所需的结果:
var resultList = firmList
.GroupBy(firm => firm.name)
.OrderBy(nameGroup => nameGroup.Key)
.SelectMany(nameGroup => nameGroup
.GroupBy(firm => firm.email)
.Where(emailGroup => emailGroup.Count() > 1)
.SelectMany(emailGroup => emailGroup)
.GroupBy(firm => firm.addy)
.Where(addyGroup => addyGroup.Count() > 1)
.SelectMany(addyGroup => addyGroup)
)
.ToList();
您可以使用匿名对象对多个列进行分组。请注意,在这个比较中存在歧义。假设两家公司名称相同,但电子邮件和城市不同。所以它们不是复制品。现在有第三家公司同名,电子邮件地址为company1和City of company2。即使1号公司和2号公司不是重复的,也会有三个重复吗?如果他们有相同的名字和地址,或者他们有相同的名字和电子邮件,或者他们有相同的地址和电子邮件,那么他们被认为是重复的。我不清楚,所以这是我的错。我道歉好吧,让我们把公司c1:A,B,C的名字,电子邮件,城市,c2:A,D,E。不相等吧?加上c3:A,B,E。现在我们有c1=c3和c2=c3,但是c1!=c2。它不计算。您可以使用匿名对象对多个列进行分组。请注意,在这个比较中存在歧义。假设两家公司名称相同,但电子邮件和城市不同。所以它们不是复制品。现在有第三家公司同名,电子邮件地址为company1和City of company2。即使1号公司和2号公司不是重复的,也会有三个重复吗?如果他们有相同的名字和地址,或者他们有相同的名字和电子邮件,或者他们有相同的地址和电子邮件,那么他们被认为是重复的。我不清楚,所以这是我的错。我道歉好吧,让我们把公司c1:A,B,C的名字,电子邮件,城市,c2:A,D,E。不相等吧?加上c3:A,B,E。现在我们有c1=c3和c2=c3,但是c1!=c2。它无法计算。谢谢,请原谅我的无知,但代码无法运行。给我带来问题的部分是:y=>x.SelectManyz=>!z、 email.Containsy.email。错误为错误5无法从用法推断方法“System.Linq.Enumerable.SelectManySystem.Collections.Generic.IEnumerable,System.Func”的类型参数。请尝试显式指定类型参数。谢谢,请原谅我的无知,但代码无法运行。给我带来问题的部分是:y=>x.SelectManyz=>!z、 email.Containsy.email。错误为错误5无法从用法推断方法“System.Linq.Enumerable.SelectManySystem.Collections.Generic.IEnumerable,System.Func”的类型参数。尝试显式指定类型参数。