从IList获取对象<>通过指定属性的唯一性

时间:2012-05-30 06:40:20

标签: c# .net

这里将详细解释: 我有

public class Season
    {
        #region Public Variables

        private int _id;
        private string _seasonName;
        private int _startMonth;

        #endregion

        #region Public Properties 

        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public int StartMonth
        {
            get { return _startMonth; }
            set { _startMonth = value; }
        }

        public string SeasonName
        {
            get { return _seasonName; }
            set { _seasonName = value; }
        }

        #endregion

        #region Public Constructor

        public Season()
        {
            this._initialize();
        }

        public Season(string pSeasonName, int _pStartMonth,int pID)
        {
            this._initialize(pSeasonName, _pStartMonth, pID);
        }

        #endregion

    }

接下来我有如下所示

IList<Season> seaosns = new List<Season>();
seaosns.Add(new Season("Summer", 4, 1));
seaosns.Add(new Season("Winter", 6, 2));
seaosns.Add(new Season("MidSummer", 10, 1));

如果在Ilist Items中重复了Ids,我需要检查一下。这可以通过使用For循环来完成,但需要知道是否还有其他解决方案。

先谢谢。

4 个答案:

答案 0 :(得分:4)

使用HashSet代替列表!集合是一个不包含重复元素的集合,其元素没有特定的顺序。您可以提供自定义IEqualityComparer来确定您的季节的唯一性。

var seaosns = new HashSet<Season>(seasonsEqualityComparer);
seaosns.Add(new Season("Summer", 4, 1));
seaosns.Add(new Season("Winter", 6, 2));
seaosns.Add(new Season("MidSummer", 10, 1)); // returns false...

答案 1 :(得分:4)

最合适的方法是使用唯一属性(Dictionary<int,Season>)作为字典中的键,将项目(代替或另外)存储在Id中。然后你有一个O(1)查找来测试存在,并按键(Id)获取。但请注意,词典 未订购 - 这意味着,它不保证要遵守广告订单或键盘顺序。订单未定义 - 因此,如果您按特定顺序需要它们,则可能需要单独保留它。

答案 2 :(得分:3)

您可以使用IDictionary代替IList,但不允许使用重复键。您可以使用Season.Id作为密钥。使用Lookup将允许您复制元素,因此您可以迭代键并检查与其关联的元素数量。

答案 3 :(得分:0)

如果您只想检查,请尝试以下操作:

var hasDuplicates = list.GroupBy(season => season.Id).Any(groupping => groupping.Count() > 1);  

但是如果你想获得集合,那么最初没有重复,使用HashSet或Dictionary,就像其他人所说的那样,或者从Collection中创建不允许添加重复项的子类。