从列表中删除重复的对象

时间:2015-09-03 22:40:20

标签: c#

我目前正在开展一个项目并遇到障碍。

我参加了一个未格式化的UPDATE橄榄球队,我试图过滤数据并以更加便宜的格式返回。

我对它的大部分都很好(拆分字符串以获取相关值并对格式进行排序),除了我创建了一个Team对象,它保存了大部分数据并且我循环遍历我创建的原始字符串每次看到团队名称时都会有一个新的团队对象。然后我检查我之前是否看过那个对象,如果我没有创建一个新对象。创建团队或跳过该部分后,我将相关信息添加到团队对象并继续。

我的问题是我用来保存最终团队信息的列表有很多重复,这意味着我检查对象是否存在并不起作用。代码是:

分割字符串后,

FROM

当我打印列表时,我得到了我想要的格式,但是多个德国等等。只有那个游戏的得分等而不是它们全部添加到1德国队对象。

任何想法如何在每次看到团队名称时如何停止重复并保持仅使用1个Team对象?

由于

2 个答案:

答案 0 :(得分:0)

您可以为Team类实现IEqualityComparer,并根据其值检查对象的相等性。像下面的东西。

    using System.Collections.Generic;
    public class Team{
        public string Name {get;set;}
        public int score {get;set;}
        }
        //Create some dummy data
    public List<Team> lstTeam = new List<Team>{
        new Team{Name="A", score=1},
        new Team{Name="A", score=1},
        new Team{Name="B", score=1},
        new Team{Name="C", score=2},
        new Team{Name="A", score=2},
        new Team{Name="C", score=2}

        };   

     List<Team> lstDistictTeams = lstTeam.Distinct<Team>(new DistinctComparer()).ToList();
     foreach(Team t in lstDistictTeams)
     {
         Console.WriteLine("Team {0} has Score {1}",t.Name,t.score);
         }

//This class provides a way to compare two objects are equal or not
     public class DistinctComparer : IEqualityComparer<Team>
        {
            public bool Equals(Team x, Team y)
            {
                return (x.Name == y.Name && x.score == y.score); // Here you compare properties for equality
            }
            public int GetHashCode(Team obj)
            {
                return (obj.Name.GetHashCode() + obj.score.GetHashCode());
            }
        } 

以下是运行示例:http://csharppad.com/gist/6428fc8738629a36163d

答案 1 :(得分:0)

问题是您是否正在为每个结果创建一个包含团队名称的新Team对象。

然后,当您与列表进行比较以查看其是否已包含时,您需要检查列表中是否有对该对象的引用,并且您刚刚创建了该对象,不会有,所以你创建的每个Team对象都会被添加到列表中。

您需要检查列表是否包含带有名称的Team对象,而不是仅检查对象的实例。