如何在列表中从具有多个变量的 class 中提取变量

How to extract variable from a class with multiple variables, within a list

我正在努力使这个程序成为一个词汇表,您应该可以在其中添加两种语言的单词。当对您添加的单词数量感到满意时,您可以按下一个按钮,然后您可以根据这些单词测试自己。

在这样做的过程中,我最终制作了一个包含两种语言的单词的自定义 class,并且它是否曾在单词测试中使用过。现在我停下来,尝试用列表中 class 中的单词填充文本框,但我不知道如何获取数据。

我尝试了很多东西,但作为一个新手,我只是把洞越挖越深,我就是起不来...

namespace Uppgift_13._1__Glosprogramet_
{
    public partial class Glosprogram : Form
    {
        List<glosa> glosLista = new List<glosa>();
        Random slump = new Random();
        glosa glosor = new glosa("", "", false);

        int valAvSpråk; //Choice of language
        int valAvGlosa; //Choice of glossary
        string valAvOrd; //Choice of word (glossary and then what language (which word of that glossary))

        public Glosprogram()
        {
            InitializeComponent();
        }

        private void btnLäggTillGlosa_Click(object sender, EventArgs e)
        {
            /*Här läggs ett objekt in i listan enligt en klass jag skapat som
            innehåller det svenska ordet, den engelska översättningen och ifall den anänts i glostestet.*/
            glosLista.Add( (new glosa(tbxSvensktOrd.Text, tbxEngelsktOrd.Text, false) ) );
            btnStartaGlostest.Enabled = true;
        }

        private void btnStartaGlostest_Click(object sender, EventArgs e)
        {
            /*Känner vi oss klara med mängden inlagda glosor så kan vi då klicka på starta glostest
             för att testa oss på glosorna. Då låses fönstret för att lägga till nya glosor och 
             ett svenskt eller engelskt ord dyker upp i en av rutorna som man sedan får svara på
             i den andra rutan och också det andra språket då.*/
            gbxLäggTillGlosor.Enabled = false;
            gbxGlostest.Enabled = true;

            // 0=Svenska rutan, 1=Engelska rutan
            valAvSpråk = slump.Next(0, 2);
            valAvGlosa = slump.Next(0, glosLista.Count + 1);
            
            //THIS IS WHERE I AM HAVING MY PROBLEMS... CAN'T QUITE FIGURE IT OUT.

            if(valAvSpråk == 1) //So if english is the language of choice, it should fill that textbox with the random
            {                   //glossary in english and then lock it and let the user answer in Swedish. The rest is comparing the answer to the varibale in the class, within the list, again.. Am lost...
                tbxEngelsktOrdGlostest.Text = "" + glosLista.;
                tbxEngelsktOrdGlostest.ReadOnly = true;
            }

            else
            {

            }
        }

        private void btnSvara_Click(object sender, EventArgs e)
        {
            glosLista.Insert(valAvGlosa, new glosa(glosor.svenskGlosa, glosor.engelskGlosa, true));
            tbxEngelsktOrdGlostest.Clear();
            tbxSvensktOrdGlostest.Clear();
            tbxResultat.AppendText("" + "\r\n");
        }

        private void btnNyaGlosor_Click(object sender, EventArgs e)
        {
            //Tömma listan på glosor, svenska och engelska, rensa resultatlistan.
            gbxLäggTillGlosor.Enabled = true;
            gbxGlostest.Enabled = false;
        }
    }
}


And then my class that I created for thisnamespace Uppgift_13._1__Glosprogramet_
{
    class glosa
    {
        private string privatSvenskGlosa;          //Swedish translation of word
        private string privatEngelskGlosa;         //English translation of word
        private bool privatAnväntGlostest = false; //Is used in word-test

        public glosa(string msvenskGlosa, string mengelskGlosa, bool manväntGlostest)
        {
            this.svenskGlosa = msvenskGlosa;
            this.engelskGlosa = mengelskGlosa;
            this.använtGlostest = manväntGlostest;
        }

        public string svenskGlosa 
        {
            get
            {
                return privatSvenskGlosa;
            }

            set
            {
                privatSvenskGlosa = value.ToLower();
            }
        }


        /*Samtidigt gör klassen om alla inmatningar till att enbart vara skrivet i små bokstäver
        för att underlätta att hitta i indexet senare samt inte få fel för att man skrivit
        med stor bokstav i början en gång och sedan skriver med liten bokstav en annan.*/
        public string engelskGlosa
        {
            get
            {
                return privatEngelskGlosa;
            }

            set
            {
                privatEngelskGlosa = value.ToLower();
            }
        }

        public bool använtGlostest
        {
            get
            {
                return privatAnväntGlostest;
            }

            set
            {
                privatAnväntGlostest = value;
            }
        }
    }
}

我只回答标题的问题“如何从列表中包含多个变量的 class 中提取变量?” (我不喜欢阅读 non-English 代码)。

假设您有一个列表:

var list = new List<MyClass>
{ 
    new MyClass { PropertyA = “A”, PropertyB = “B” },
    new MyClass { PropertyA = “1”, PropertyB = “2” }
}

首先找到您需要的实例(class):

var obj = list.FirstOrDefault(x => x.PropertyA == “1”);

然后获取成员的值:

if (obj != null)
{
    var myVariable = obj.PropertyB;
}

如果您确定您的搜索会找到 object,那么您可以使用 First 而不是 FirstOrDefault(两者都来自命名空间 System.Linq)并且跳过 null-check.

如果需要随机元素:

var random = new Random(); // random number generator
var randomElement = list[random.Next(list.Count)];

关于 System.Random 的注意事项:

最好制作一个 Random class 的实例并重复使用它,而不是使用它一次并为每个随机数创建一个新实例,因为如果你实例化 Random class,它的第一个值(以及接下来的一系列数字)取决于当前的 DateTime(在 .NET Framework 中),如果在非常短的时间跨度内实例化,这些实例可能会给出相同的“随机”值。更多信息:https://docs.microsoft.com/en-us/dotnet/api/system.random?view=net-6.0#instantiating-the-random-number-generator

您似乎想从列表中随机选择一项

你需要

               // pick the element from the list
               var glosEnt = glosLista[valAvGlosa];
               if(valAvSpråk == 1)  
               {     
                     tbxEngelsktOrdGlostest.Text = glosEnt.engelskGlosa;
                     tbxEngelsktOrdGlostest.ReadOnly = true;
               }