【问题标题】:Looking for elegant / efficient solution for integer keyed collection of models为整数键控模型集合寻找优雅/高效的解决方案
【发布时间】:2017-02-09 08:44:55
【问题描述】:

“AddToLeg”方法似乎啰嗦了,有没有更好的模式或更有效的方法来实现它?我考虑过使用字典,但我希望密钥保持为整数。我对 linq / generics 很陌生,所以我可能遗漏了一些更明显的东西。当我查看文档时,实际上并没有任何与我的场景相匹配的示例。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main()
        {
            var model = new TrainspotterItenaryViewModel();

            var manchester = new Station() { Name = "Manchester", ExpectedTime = "13:30" };
            var leeds = new Station() { Name = "Leeds", ExpectedTime = "15:00" };
            var york = new Station() { Name = "York", ExpectedTime = "15:30" };
            var london = new Station() { Name = "London", ExpectedTime = "21:00" };

            model.AddToLeg(1, manchester);
            model.AddToLeg(1, leeds);

            model.AddToLeg(2, leeds);
            model.AddToLeg(2, london);
            model.AddToLeg(1, york); //another destination added to leg 1

            //any number of legs can be added...
            model.AddToLeg(3, manchester);

            //show results contents
            for(var i=1; i <= model.Legs.Count; i++)
            {
                var displayLeg = model.Legs.Single(x=>x.LegNumber==i);
                foreach(var station in displayLeg.Stations){
                    string output = $"leg: {displayLeg.LegNumber} station: {station.Name}, expected:{station.ExpectedTime}";
                        Console.WriteLine(output);  
                }
            }
        }
    }

    public class TrainspotterItenaryViewModel
    {
        public List<Leg> Legs { get; set; }

        public void AddToLeg(int legNumber, Station station)
        {
            if (Legs == null)
            {
                Legs = new List<Leg>();
            }

            var legCount = Legs.Count(x => x.LegNumber == legNumber);
            if (legCount == 0)
            {
                var leg = new Leg
                {
                    LegNumber = legNumber,
                    Stations = new List<Station> {station}
                };

                Legs.Add(leg);

                Console.WriteLine($"Leg {leg.LegNumber} Not Found- Added new leg and {station.Name}");
            }
            else
            {
                foreach (var leg in Legs)
                {
                    if (leg.LegNumber == legNumber)
                    {
                        leg.Stations.Add(station);
                        Console.WriteLine($"Leg {legNumber} Found- adding {station.Name}");
                    }
                }
            }
        }
    }

    public class Leg
    {
        public int LegNumber { get; set; }
        public List<Station> Stations { get; set; }
    }

    public class Station
    {
        public string Name { get; set; }
        public string ExpectedTime { get; set; }
    }
}

【问题讨论】:

  • 使用 Dictionary Legs 而不是 List。

标签: c# linq generics design-patterns collections


【解决方案1】:

为此任务使用字典:

    public class TrainspotterItenaryViewModel
    {
        private Dictionary<int, Leg> _legNumberToLegIndex { get; set; }

        public IEnumerable<Leg> Legs => _legNumberToLegIndex?.Values

        public void AddToLeg(int legNumber, Station station)
        {
            if (_legNumberToLegIndex == null)
            {
                _legNumberToLegIndex = new Dictionary<int, Leg>();
            }

            Leg leg;
            if (!_legNumberToLegIndex.TryGetValue(legNumber, out leg))
            {
                leg = new Leg
                {
                    LegNumber = legNumber,
                    Stations = new List<Station>()
                };
                _legNumberToLegIndex.Add(legNumber, leg);
            }
            leg.Stations.Add(station);
        }
    }

【讨论】:

    【解决方案2】:

    FirstOrDefault 方法已返回您正在搜索的对象,因此您可以简化代码

        public List<Leg> Legs { get; set; } = new List<Leg>();
    
        public void AddToLeg(int legNumber, Station station)
        {
            var leg = Legs.FirstOrDefault(x => x.LegNumber == legNumber);
            if (leg == null)
            {
                leg = new Leg
                {
                    LegNumber = legNumber,
                    Stations = new List<Station> { station }
                };
    
                Legs.Add(leg);
    
                Console.WriteLine($"Leg {leg.LegNumber} Not Found- Added new leg and {station.Name}");
            }
            else
            {
                leg.Stations.Add(station);
                Console.WriteLine($"Leg {legNumber} Found- adding {station.Name}");
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多