C# C.NET 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

我有一个公司对象列表,包括名称、地址、电子邮件等。我需要一种按公司名称对列表进行排序的方法,我可以轻松做到这一点。但是我需要比较电子邮件和城市。如果其中一个与同名公司匹配,我需要同时删除它们

我可以很容易地做。首先得到一个和删除匹配的一个,但我需要从列表中删除原始的。有道理? 下面的2条LINQ语句删除了重复项,但没有删除原始项

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”的类型参数。尝试显式指定类型参数。