列表中的多个参数。没有类如何创建?

Posted

技术标签:

【中文标题】列表中的多个参数。没有类如何创建?【英文标题】:Multiple parameters in a List. How to create without a class? 【发布时间】:2011-05-14 18:04:48 【问题描述】:

这可能是一个非常明显的问题,但我将如何在不创建类的情况下创建具有多个参数的List

例子:

var list = new List<string, int>();

list.Add("hello", 1);

我通常会使用这样的类:

public class MyClass

    public String myString get; set;
    public Int32 myInt32 get; set;

然后通过执行以下操作创建我的列表:

var list = new List<MyClass>();
list.Add(new MyClass  myString = "hello", myInt32 = 1 );

【问题讨论】:

您确定要列表而不是字典吗?您可能应该就您的实际问题提供更多详细信息,以便清楚您为什么要这样做。 你想用这个列表做什么? 我不要字典。我试图使用一个简单的示例...我将使用两个字符串,它们通过 ASP.NET MVC Controller.Json 以 JSON 格式返回 【参考方案1】:

如果您使用的是 .NET 4.0,则可以使用 Tuple

List<Tuple<T1, T2>> list;

对于旧版本的 .NET,您必须创建一个自定义类(除非您足够幸运能够在基类库中找到适合您需要的类)。

【讨论】:

+1,虽然 Tuple 是在 .NET 4 中引入的,所以在 .NET 3.5 中他仍然坚持编写一个类。 @David:他在问如何“不创建类” @Jim Schubert:很公平,当然。虽然如果他在可预见的未来使用 3.5,那么 Tuple 类将成为一个方便的可重用实用程序。 @Darcy:这个博客有一个用于 .NET 3.5 的 Tuple 实现:amirrajan.net/Blog/tuple【参考方案2】:

如果您不介意项目是不可变的,您可以使用添加到 .net 4 的 Tuple 类

var list = new List<Tuple<string,int>>();
list.Add(new Tuple<string,int>("hello", 1));

list[0].Item1 //Hello
list[0].Item2 //1

但是,如果您每次都添加两个项目并且其中一个是唯一 ID,您可以使用 Dictionary

【讨论】:

【参考方案3】:

如果合适,您可以使用一个也是通用集合的 Dictionary:

Dictionary<string, int> d = new Dictionary<string, int>();
d.Add("string", 1);

【讨论】:

+1 这正是我要建议的,但问题的“参数”部分让我相信他正在寻找两种以上的类型。由于 Dictionary(T,K) 和 List(T) 继承自 IEnumerable 和 ICollection,因此它们的使用方式非常相似。 Dictionary&lt;string,Tuple&lt;T1, T2&gt;&gt; myData = new Dictionary&lt;string,Tuple&lt;T1, T2&gt;&gt;(); 在我的案例中我将使用什么来按键获取元组数据【参考方案4】:

另一种解决方案创建匿名类型的通用列表。

 var list = new[]
  
    new  Number = 10, Name = "Smith" ,
    new  Number = 10, Name = "John"  
 .ToList();

 foreach (var item in list)
 
    Console.WriteLine(item.Name);
 

这也为您提供intellisense 支持,我认为在某些情况下它比TupleDictionary 更好。

【讨论】:

【参考方案5】:

List 只接受一种类型参数。 与 List 最接近的是:

 var list = new List<Tuple<string, int>>();
 list.Add(Tuple.Create("hello", 1));

【讨论】:

【参考方案6】:

为了添加其他建议,我喜欢以下构造,以避免将成员添加到 keyvaluepair 集合的烦恼。

public class KeyValuePairList<Tkey,TValue> : List<KeyValuePair<Tkey,TValue>>
    public void Add(Tkey key, TValue value)
        base.Add(new KeyValuePair<Tkey, TValue>(key, value));
    

这意味着构造函数可以用更好的语法进行初始化::

var myList = new KeyValuePairList<int,string>1,"one",2,"two",3,"three";

我个人喜欢上面的代码而不是更冗长的例子不幸的是,C# 本身并不真正支持元组类型,所以这个小技巧可以创造奇迹。

如果您发现自己确实需要超过 2 个,我建议针对元组类型创建抽象。(尽管 Tuple 是一个类而不是像 KeyValuePair 这样的结构,这是一个有趣的区别)。

奇怪的是,初始化列表语法在任何IEnumerable 上都可用,它允许您使用任何Add 方法,即使是那些实际上不能被您的对象枚举的方法。允许将object[] 成员添加为params object[] 成员之类的操作非常方便。

【讨论】:

【参考方案7】:

正如 Scott Chamberlain(和其他几个人)所说,如果您不介意拥有不可变(即只读)对象,则元组效果最好。

如果像大卫建议的那样,你想通过字符串值引用 int,例如,你应该使用字典

Dictionary<string, int> d = new Dictionary<string, int>();
d.Add("string", 1);
Console.WriteLine(d["string"]);//prints 1

但是,如果您想将元素可变地存储在列表中,并且不想使用字典式引用系统,那么您最好的选择(即目前唯一真正的解决方案)是使用 KeyValuePair,这本质上是 C# 的 std::pair :

var kvp=new KeyValuePair<int, string>(2, "a");
//kvp.Key=2 and a.Value="a";
kvp.Key = 3;//both key and
kvp.Value = "b";//value are mutable

当然,这是可堆叠的,因此如果您需要更大的元组(例如,如果您需要 4 个元素),您只需将其堆叠即可。诚然,这会很快变得丑陋:

     var quad=new KeyValuePair<KeyValuePair<int,string>, KeyValuePair<int,string>>
                (new KeyValuePair<int,string>(3,"a"),
                new KeyValuePair<int,string>(4,"b"));
//quad.Key.Key=3

显然,如果您要这样做,您可能还应该定义一个辅助函数。

我的建议是,如果您的元组包含超过 2 个元素,请定义您自己的类。您可以使用 typedef-esque using 语句,例如:

using quad = KeyValuePair<KeyValuePair<int,string>, KeyValuePair<int,string>>;

但这不会让您的实例化变得更容易。如果在处理超过 2 个元素的元组时使用用户定义的类,您可能会花费更少的时间编写模板参数和更多的时间在非样板代码上

【讨论】:

【参考方案8】:

对于那些想要使用类的人。

用你想要的所有参数创建一个类

创建一个以类为参数的列表

class MyClass
        
            public string S1;
            public string S2;
        

List<MyClass> MyList= new List<MyClass>();

【讨论】:

【参考方案9】:

从数据库中获取架构名称和表名称。

        public IList<Tuple<string, string>> ListTables()
        

            DataTable dt = con.GetSchema("Tables");

            var tables = new List<Tuple<string, string>>();

            foreach (DataRow row in dt.Rows)
            
            string schemaName = (string)row[1];
            string tableName = (string)row[2];
            //AddToList();
            tables.Add(Tuple.Create(schemaName, tableName));
            Console.WriteLine(schemaName +" " + tableName) ;
            
            return tables;
        

【讨论】:

【参考方案10】:

这对我来说很好用

List<string> myList = new List<string>();
myList.Add(string.Format("0|1","hello","1") ;


label:myList[0].split('|')[0] 
val:  myList[0].split('|')[1]

【讨论】:

这不是一个好主意,因为字符串本身可能包含 |标志,然后会破坏事物。

以上是关于列表中的多个参数。没有类如何创建?的主要内容,如果未能解决你的问题,请参考以下文章

python如何使用__new__()函数的参数列表中的属性创建类?

如何使用 C++ 中的类创建和填充链表?

如何在没有参数列表太长的情况下移动多个文件?

有没有办法将多个(和不同的)参数从闪电网络组件(LWC)中的 JS 传递给 Apex 控制器类?

在 C++ 中的多个类中使用模板类

如何从 SQL Server 中的存储过程中检索参数列表