【问题标题】:Making a List<string, string, string> in C# with three flexible elements in one datatype在 C# 中创建一个 List<string, string, string> 在一个数据类型中具有三个灵活的元素
【发布时间】:2013-09-04 17:35:48
【问题描述】:

一旦我定义了List&lt;string, string, string&gt;,现在我想再做一次,但我忘记了语法并丢失了我这样做的示例代码,但我肯定知道这是可能的。在我定义它之后,我以这种方式向列表中添加了一个新元素:ListXY.Add("string1", "string2", string3");。我在互联网上的搜索并没有带来我需要的结果。我绝对坚持使用“列表”的解决方案,这就是为什么我现在在这里问我的问题。我发现下面的变通办法不满足我,因为我需要通常的“列表”的简单性 - 没有别的。

我主要不是使用元组或自己的类或静态数组来搜索解决方案,因为 作为初学者,我很难处理复杂的结构或类。

编辑:我同时找到了Dictionary&lt;string, string&gt;,但我需要三个项目。 我不记得我用过什么,我只知道它已经准备好(来自 MS)包含 在框架 NET 2 中,有三个字符串元素,我可以使用 .Add 方法扩展这些元素。字符串数组已经具有静态大小,我无法使用初学者代码缩小或放大它。而当我定义变量时,无法预见最终元素的数量,这就是问题所在。

如果您知道我忘记的语法并且无法再次找到,您可以回复我正确的答案。 我目前正在搜索语法。

【问题讨论】:

  • 我认为 Dave 已经指出 List&lt;T&gt; 类型只有 1 个泛型参数,那就是 T... 所以你最多有一个 List&lt;string&gt;,但是一个 @ 987654329@ 没有发生...
  • 你提到的数据结构List&lt;T1, T2, T3&gt;在C#框架中默认是不存在的。 F# 中有类似的东西,一个 function called List.zip3 返回一个 List&lt;T1, T2, T3&gt;,但我不确定这是否是你想要的......
  • “你绝对不知道”是什么意思?如果您认为我错了,那么我会向您指出:msdn.microsoft.com/en-us/library/… 这清楚地表明只有List&lt;T&gt; 可用。您可以创建自己的List&lt;T1, T2, T3&gt;,但我不确定实现会是什么样子!

标签: c# .net string list


【解决方案1】:

如果你真的不想创建一个类,你可以使用元组,它们没有那么复杂。

List<Tuple<string,string,string>> items 
= new List<Tuple<string, string, string>>(){ Tuple.Create("a","b","c")};

items.Add(Tuple.Create("1","2","3"));
items.Add(Tuple.Create("4","5","6"));

【讨论】:

    【解决方案2】:

    如果您要求使用语法来一次初始化包含多个元素的列表,那么:

    var l = new List<string>{ "string1", "string2", "string3" .... };
    

    如果您正在寻找一种在单个列表项中保存三个字符串的方法,而不使用元组或自定义类,恐怕没有办法做到这一点。

    编辑:除非您正在生成字符串 - 在这种情况下,您可以以匿名类型生成它们,例如:

    Enumerable
        .Range(1, 100)
        .Select(i => new 
        { 
            string1 = "string1" + i, 
            string2 = "string2" + i, 
            string3 = "string3" + i 
        });
    

    但这真的很奇怪。

    另外,您可以使用列表列表,例如:

    var l = new List<List<string>>
    { 
        new List<string> { "string 1", "string 2", "string 3" }, 
        new List<string> { "string 1", "string 2", "string 3" }
    };
    

    【讨论】:

    • 可能是List&lt;List&lt;List&lt;string&gt;&gt;&gt;?!
    • 嗯,那是因为BCL没有这样的集合
    【解决方案3】:

    “我不需要一个解决方案,说我自己制作课程。我绝对不会重新发明已经存在的数据类型!” List&lt;string,string,string&gt; 不是已经存在的数据类型。您过去可能做过类似的事情;

    // Another simple way would be to create a class which has a constructor to hold the three strings
        public class PairedValues
        {
            // These are just simple ways of creating a getter and setter in c#
            public string value1 { get; set; }
            public string value2 { get; set; }
            public string value3 { get; set; }
    
            // A constructor which sets all your getters and setters
            public PairedValues(string Value1, string Value2, string Value3)
            {
                value1 = Value1;
                value2 = Value2;
                value3 = Value3;
            }
        }
    

    利用类;

            // Simply initialize a list of your new class
            List<PairedValues> pairedValues = new List<PairedValues>();
            // add you object to the list anonymously 
            pairedValues.Add(new PairedValues("string1","string2","string3"));
            pairedValues.Add(new PairedValues("string1", "string2", "string3"));
    
            // Accessing the values
            foreach (PairedValues pair in pairedValues)
            {
                string value1 = pair.value1;
                string value2 = pair.value2;
                string value3 = pair.value3;
            }
    

    在 windows 窗体中使用它的示例;

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            // Another simple way would be to create a class which has a constructor to hold the three strings
            public class PairedValues
            {
                public string value1 { get; set; }
                public string value2 { get; set; }
                public string value3 { get; set; }
    
                public PairedValues(string Value1, string Value2, string Value3)
                {
                    value1 = Value1;
                    value2 = Value2;
                    value3 = Value3;
                }
            }
    
            public Form1()
            {
                InitializeComponent();
    
                // Simply initialize a list of your new class
                List<PairedValues> pairedValues = new List<PairedValues>();
                pairedValues.Add(new PairedValues("string1", "string2", "string3"));
                pairedValues.Add(new PairedValues("string1", "string2", "string3"));
    
                // Accessing the values
                foreach (PairedValues pair in pairedValues)
                {
                    string value1 = pair.value1;
                    string value2 = pair.value2;
                    string value3 = pair.value3;
                }
            }
        }
    }
    

    【讨论】:

    • @feedwall 我提供了一个如何在 win 表单中使用的示例。随时以我的方式提出任何问题,我一定会尽可能地编辑和更新我的答案
    【解决方案4】:

    您可能正在考虑您曾经创建的扩展方法。

    public static class MyExtensions
    {
        public static void Add(this List<String> list, String param1, String param2, String param3)
        {
            list.Add(param1);
            list.Add(param2);
            list.Add(param3);
        }
    }
    

    那么只要你有一个 using for System.Linq,你就可以在任何 List 实例上调用它:

        List<String> stringList = new List<String>();
        stringList.Add("something", "awesome", "here");
    

    有关扩展方法及其工作原理的更多信息,请转至here

    【讨论】:

    • 不会将字符串值添加为三个单独的元素吗?我相信 OP 希望所有三个值都充当一个元素
    • 它会,但老实说我不知道​​如何在不创建新类的情况下调用 List.Add(string, string, string)。 OP 似乎他已经知道他在寻找什么,他只是忘记了它是什么,所以我把选项扔在那里。
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2020-12-12
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2018-10-13
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多