c# - 为整数键控模型集合寻找优雅/高效的解决方案

标签 c# linq generics design-patterns collections

“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; }
    }
}

最佳答案

为此任务使用字典:

    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);
        }
    }

关于c# - 为整数键控模型集合寻找优雅/高效的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42131859/

相关文章:

c# - Windows 版本在设计中显示出真正的值(value),但在我运行程序时显示出不同的值(value)

c# - 使用linq确定ListB中是否存在ListA的任何元素?

swift - 如何在 Swift 中实现泛型转换初始化器?

c# - 我如何才能找到其泛型类型派生自给定基类型的所有 DbSet?

c# - 过滤命名空间中除当前程序集之外的所有程序集

c# - 为什么嵌套公共(public)类比它的父类更难访问?

c# - 如何根据时钟使定时器以完全相同的间隔启动?

C#在几个月内有所不同?

c# - Linq - 序列包含多个元素

java - 没有参数的泛型方法