【问题标题】:Easiest way to represent a list of string pairs literally in c#?在 C# 中字面上表示字符串对列表的最简单方法?
【发布时间】:2013-06-07 10:16:01
【问题描述】:

我想创建几个字符串对的短(有序)列表,并在代码中使用简洁的文字表示。有没有很好的方法来做到这一点?我能想到的最好的方法是

     using Pairs = System.Collections.Specialized.OrderedDictionary;
     ...
            var z = new Pairs()
            {
                { "a", "b" },
                { "c", "d" }
            };

但是缺乏类型安全有点可怕。似乎没有通用的有序字典。

还有哪些其他类有字面初始化语法?是否可以为类定义自己的初始化器语法?

【问题讨论】:

  • SortedDictionary<TK,TV>? msdn.microsoft.com/en-us/library/f7fta44c.aspx
  • 使用范围是什么?如果是本地方法的作用域,可以使用匿名对象列表。
  • @Ilya - 我需要创建一个可以传递的对象。我对匿名对象了解不多 - 我可以在本地方法中以某种方式使用它们来创建非匿名对象(例如List<KeyValuePair>)吗?

标签: c# literals keyvaluepair


【解决方案1】:

n-by-2 数组允许这种初始化语法:

string[,] z = { { "a", "b" }, { "c", "d" }, { "z", "w" }, };

在这种情况下,尺寸为 3×2。

如果您更喜欢数组数组string[][],则语法会更笨拙。某些行可能意外(或有意)具有与其他行不同的长度(“锯齿状”数组)。在“外部”数组上使用Array.Sort 可能更容易对数组进行排序,其中一些是IComparer<string[]> 或Comparison<string[]>。

否则,请使用SortedDictionary<string, string> 或SortedList<string, string>,正如spender 的评论中所建议的那样:

var z = new SortedDictionary<string, string> { { "a", "b" }, { "c", "d" }, { "z", "w" }, };

任何类型,包括用户定义的类型,只要有一个(可访问的和非静态的)Add 方法,它接受两个字符串,都将允许这种集合初始化器。例如:

var z = new YourType { { "a", "b" }, { "c", "d" }, { "z", "w" }, };

大致相当于:

YourType z;
{
    var temp = new YourType();
    temp.Add("a", "b");
    temp.Add("c", "d");
    temp.Add("z", "w");
    z = temp;
}
// use variable z here

【讨论】:

  • 太棒了——我从来不知道!这仅限于字符串吗?大概编译器只是插入对 Add() 的调用,而我的自定义类型对它们的作用取决于我(约定除外)?
  • @Rob 参数的数量和类型可以变化。编译器将照常执行重载解析,以确定要调用的Add 的非静态重载。要求YourType 实现IEnumerable,在这种情况下编译器会认为“YourType 是一个集合(IEnumerable),那么我将允许集合初始化语法”。对于列表中的每个元素,它不一定与 Add 的重载相同。如果可以推断类型参数(类型推断),Add 方法甚至可以是通用的。真的很灵活...
  • TIL 关于 string[,] 语法!像使用 queryParams[i,0] 格式的常规数组一样,使用 for 循环很容易进行迭代。
【解决方案2】:

使用Tuple 类 - 它很好地抽象了一对。 比如:

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

【讨论】:

  • 好的 - 我有效地做到了这一点,使用KeyValuePair(我们仍在使用.Net 3.5)并创建了一个名称较短的方法(Pair)来执行构造。仍然希望能够完全避免构造函数
【解决方案3】:

没有通用的 OrderedDictionary,但有通用的 SortedDictionary。改用它。

【讨论】:

  • 不幸的是,成对的顺序很重要
  • pairs的顺序,不是键的顺序?那么,您不应该使用字典,只需 List&lt;Tuple&lt;String,String&gt;&gt;
  • 或者如果在 .NET 4.0 或更高版本上使用 SortedSet&lt;Tuple&lt;string, string&gt;&gt;?取决于如何比较两对(Tuple&lt;,&gt; 按字典顺序)。
猜你喜欢
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多