【问题标题】:why is List<int> empty,even if I added values to it? c#为什么 List<int> 是空的,即使我向它添加了值? C#
【发布时间】:2022-01-18 00:51:55
【问题描述】:

我有一个问题,我基本上知道答案。我想知道为什么新创建的List&lt;int&gt; 是空的,为什么即使我用值填充它也是空的?我可以轻松地在类 Vysvedceni(ReportCard) 列表中创建它,然后在 Main 类中创建一个单独的字段,然后将其添加到 Dictionary&lt;Enum,List&lt;int&gt;&gt; ...

类似的东西:

List<Enum,List<int>> array = new ...
array.Add(1);
array.Add(2);
array.Add(5);
dic[Subject].Add(array);

但我想换一种方式:

Student student = new Student("Jan", "Novak",new Vysvedceni());
student.Vysvedceni.Znamky.Add(Vysvedceni.Subjects.math, new List<int>() {1,1,2,3,4,3});

我的目标很简单,打印带有学生及其分数的字典。
我的母语不是英语,我想把代码翻译一下,但我怕你复制代码会弄得一团糟。至少我添加了一个小翻译。 我还添加了我的评论,问题出在哪里或有什么方法。

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

namespace Cviceni1412
{
    class Student
    {
        private string jmeno; //Name
        private string prijmeni; //Surname
        private Vysvedceni vysvedceni;
        //Dictionary<List<Student>, List<Vysvedceni>> vysvedceniTridy = new Dictionary<List<Student>, List<Vysvedceni>>();
    
        List<Student> studenti = new List<Student>();

        public void SetridStudenty()
        {
            var setrid = (from student in studenti select student)
                .GroupBy(student => student.Jmeno.First()).ToList();
            foreach (var item in setrid)
            {
                Console.WriteLine(item);
            }
        }
    
        public override string ToString()
        {
            return "jmeno:"+jmeno + ",prijmeni:" + prijmeni;
        }
    
        public Student(string jmeno, string prijmeni, Vysvedceni vysvedceni)
        {
            this.jmeno = jmeno;
            this.prijmeni = prijmeni;
            this.vysvedceni = vysvedceni;
        }
    
        public string Jmeno { get => jmeno; set => jmeno = value; }
        public string Prijmeni { get => prijmeni; set => prijmeni = value; }
        internal Vysvedceni Vysvedceni { get => vysvedceni; set => vysvedceni = value; }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace Cviceni1412
{
    class Vysvedceni
    {
        private Dictionary<Enum, List<int>> znamky = new Dictionary<Enum, List<int>>();
        private Dictionary<Enum, int> vizo = new Dictionary<Enum, int>();
        private Predmety skolniPredmety;

        public Dictionary<Enum, List<int>> Znamky { get => znamky; set => znamky = value; }
        internal Predmety SkolniPredmety { get => skolniPredmety; set => skolniPredmety = value; }
        public Dictionary<Enum, int> Vizo{ get => vizo; set => vizo= value; }

        public double Prumer(Enum predmet) //Method for calulating Average and final mark for student
        {
            double prumerZnamka=Znamky[predmet].Average();
           
            return prumerZnamka ;
        }

        public void Vypis()//Print List method
        {
            Znamky.Select(i => $"{i.Key}:{i.Value}").ToList().ForEach(Console.WriteLine);
        }

        public Vysvedceni()
        {
        }

        public enum Predmety//Subjects like math,Engl,P.E.,Physic
        {
            matematika,cestina,fyzika,programovani,telocvik,databaze,webovky
        }
    }
}
//Student class

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

namespace Cviceni1412
{
    class Student
    {
        private string jmeno;
        private string prijmeni;
        private Vysvedceni vysvedceni;
        //Dictionary<List<Student>, List<Vysvedceni>> vysvedceniTridy = new Dictionary<List<Student>, List<Vysvedceni>>();

        List<Student> studenti = new List<Student>();

        public void SetridStudenty()//Sort students to the group by their first letter
        {
            var setrid = (from student in studenti select student)
                .GroupBy(student => student.Jmeno.First()).ToList();
            foreach (var item in setrid)
            {
                Console.WriteLine(item);
            }
        }

        public override string ToString()
        {
            return "jmeno:"+jmeno + ",prijmeni:" + prijmeni;
        }

        public Student(string jmeno, string prijmeni, Vysvedceni vysvedceni)
        {
            this.jmeno = jmeno;
            this.prijmeni = prijmeni;
            this.vysvedceni = vysvedceni;
        }

        public string Jmeno { get => jmeno; set => jmeno = value; }
        public string Prijmeni { get => prijmeni; set => prijmeni = value; }
        internal Vysvedceni Vysvedceni { get => vysvedceni; set => vysvedceni = value; }
    }
}
//Main class
using System;
using System.Collections.Generic;
using System.Linq;

namespace Cviceni1412
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student("Jan","Novák",new Vysvedceni());
            student.Vysvedceni.Znamky.Add(Vysvedceni.Predmety.matematika, new List<int>() {1,1,2,3,4,3 });//There is problem,List is declared and filled,but it prints just only Subject and [System.Generics...]

            Console.WriteLine(student.Vysvedceni.Znamky.Keys.Count);
            student.Vysvedceni.Vypis();  
        }
    }
}

【问题讨论】:

  • it prints just only Subject and [System.Generics...] 实际上 say 计数为 0,还是您只是在期望内容的位置获得类名? System.Object.ToString() 的默认实现打印类名....
  • 试试Znamky.Select(i =&gt; $"{i.Key}:[{string.Join(",", i.Value)}]")
  • 不要使用Enum 作为您的密钥。使用您定义的实际枚举类型Predmety。这样你就失去了类型安全。尽管枚举本身是值类型,但Enum(基类)是引用类型,因此当您在字典使用键的任何地方使用枚举值时,它们会被装箱。
  • @BenVoigt 它为键打印 1,为值(计数)打印 1

标签: c# arrays list linq empty-list


【解决方案1】:

我是如何解决的。 问题不在于 ToString() 方法,而在于 Print() 方法。Linq 只迭代了 Keys。希望我能帮上忙

public void Print(Subjects sub)
{
    foreach (var item in marks//dictionary)
    {
        Console.WriteLine(item.Key);
  
        foreach (var ite in marks[sub])
        {
             Console.WriteLine(ite);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多