按OR条件分组的有效方法

时间:2019-07-12 10:29:12

标签: c# performance linq

我有很多标头/职位项目。我尝试按标题的属性对位置进行分组。

标题是分组条件,因此我对标题进行排序以获取特定兴趣的职位。特定的利益由OR条件限定。 为了按兴趣提取头寸,我遍历标题列表。 我正在寻找一种按特定兴趣对头寸进行排序的方法,而不是遍历标题页的标题列表。

在该示例中,仅描述了一种特定的兴趣,即调用ExampleFunction()。


    class Header
    {
        public int A { get; set; }
        public int B { get; set; }
        public int C { get; set; }
        public int D { get; set; }
        public IEnumerable<Position> Positions { get; set; }
        public Header(int a, int b, int c, int d) { A = a; B = b; C = c; D = d; }
    }
    class Position
    {
        public int P1 { get; set; }
        public int P2 { get; set; }
        public Position(int p1, int p2) { P1 = p1; P2 = p2; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var itemList = new List<Header>()
            {
                new Header(1,1,1,0) {Positions = new List<Position>() {new Position(3,5) } },
                new Header(1,1,1,1) {Positions = new List<Position>() {new Position(1,2) } },
                new Header(1,2,2,0) {Positions = new List<Position>() {new Position(8,7) } },
                new Header(1,2,3,0) {Positions = new List<Position>() {new Position(0,1) } },
                new Header(2,2,2,2) {Positions = new List<Position>() {new Position(1,0) } },
                new Header(3,2,2,1) {Positions = new List<Position>() {new Position(10,5) } },
                new Header(1,0,0,0) {Positions = new List<Position>() {new Position(11,5) } },
                new Header(1,0,2,0) {Positions = new List<Position>() {new Position(3,5) } },
            };

            var orderedItemList = itemList.OrderBy(i => i.A)
                                          .ThenBy(i => i.B)
                                          .ToList();
            Header oldItem = null;
            var positions = new List<Position>();
            foreach(var item in orderedItemList)
            {
                if (oldItem == null)
                {
                    oldItem = item;
                    continue;
                }
                else if (item.A != oldItem.A || item.B != oldItem.B)
                {
                    ExampleFunction(positions);
                    positions.Clear();
                }
                oldItem = item;
                positions.AddRange(item.Positions);
            }

            Console.ReadLine();
        }

        static void ExampleFunction(IEnumerable<Position> positions)
        {
            // Do something with the positions
        }
    }

1 个答案:

答案 0 :(得分:3)

不清楚,您想做什么。但是我有一些想法。

您可以使用ObservableCollection类型。它具有事件CollectionChanges。它可以帮助您检测是否已添加,删除或重置列表。

此外,您可以在您的课程上实现INotifyPropertyChanged接口,并确定Item中已更改的属性。