C# 正在寻找将分隔字符串转换为StringDictionary的更灵活的方法

C# 正在寻找将分隔字符串转换为StringDictionary的更灵活的方法,c#,C#,我创建了以下内容以将一些数据公开为正则表达式匹配字符串以及StringDictionary。我觉得我可以用LINQ来做这件事,而且行数更少 private const string STREETTYPES = @"ALY|Alley|AVE|Avenue|BLVD|Boulevard|CIR|Circle|CT|Court|CTR|Center|DR|Drive|EXPY|Expressway|FWY|Freeway|HALL|Hall|HWY|Highway|JCT|Junction|LN|L

我创建了以下内容以将一些数据公开为正则表达式匹配字符串以及StringDictionary。我觉得我可以用LINQ来做这件事,而且行数更少

private const string STREETTYPES = @"ALY|Alley|AVE|Avenue|BLVD|Boulevard|CIR|Circle|CT|Court|CTR|Center|DR|Drive|EXPY|Expressway|FWY|Freeway|HALL|Hall|HWY|Highway|JCT|Junction|LN|Lane|LP|Loop|PIKE|Pike|PKWY|Parkway|PL|Place|RD|Road|ST|Street|TER|Terrace|TPKE|Turnpike|TRL|Trail|WAY|Way";

  private static StringDictionary streetTypes = null;
  public static StringDictionary StreetTypes
  {
    get
    {
      if (streetTypes != null) return streetTypes;
      streetTypes = new StringDictionary();
      var streetArray = STREETTYPES.Split(PIPE);
      for (int i = 0; i < streetArray.Length-1; i = i+2)
      {
        streetTypes.Add(streetArray[i], streetArray[i + 1]);
      }
      return streetTypes;
    }
  }
【代码>私人警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方警方| Place | RD | Road | ST | Street | TER | Terrace | TPKE | Turnpike | TRL | Trail | WAY | WAY |”; 私有静态StringDictionary streetTypes=null; 公共静态StringDictionary StreetTypes { 得到 { if(streetypes!=null)返回streetypes; streetTypes=新的StringDictionary(); var streetaray=STREETTYPES.Split(管道); 对于(int i=0;i这有什么好处吗

var x = STREETTYPES.Split(new[] {'|'});
var output = Enumerable
    .Range(0, x.Length / 2)
    .ToDictionary(s => x[2 * s], s => x[2 * s + 1]);

可能可以进一步压缩,但我今晚睡了一半。

如果需要重新计算,可以使用Linq,但如果字典是静态的,只需使用初始值设定项:

var input = STREETTYPES.Split('|');
var dict = input.Select( (x,i) => new { Item = x, Index = i })
                .Where(x => x.Index % 2 == 0)
                .ToDictionary( x=> input[x.Index], x => input[x.Index + 1]);
那就:

private static readonly StringDictionary streetTypes = new StringDictionary
{
    {"ALY","Alley"},{"AVE","Avenue"},{"ALY","Alley"},{"BLVD","Boulevard"},{"CIR","Circle"},
    {"CT","Court"},{"CTR","Center"},{"DR","Drive"},{"EXPY","Expressway"},{"FWY","Freeway"},
    {"HALL","Hall"},{"HWY","Highway"},{"JCT","Junction"},{"LN","Lane"},{"LP","Loop"},
    ...        
};

厚颜无耻地剽窃Python dict构造函数:

IDictionary<TKey, TVal> 
ToDictionary<TKey, TVal>(IEnumerable<TKey> keys, 
                         IEnumerable<TVal> values) 
{
    return keys.Zip(values, (k, v)=>new {K=k, V=v}).ToDictionary(kv=>kv.K, kv=>kv.V);
}

var str = @"ALY|Alley|AVE|Avenue|BLVD|Boulevard|CIR|Circle|CT|Court|CTR|Center|DR|Drive|EXPY|Expressway|FWY|Freeway|HALL|Hall|HWY|Highway|JCT|Junction|LN|Lane|LP|Loop|PIKE|Pike|PKWY|Parkway|PL|Place|RD|Road|ST|Street|TER|Terrace|TPKE|Turnpike|TRL|Trail|WAY|Way";
var words = str.Split('|');
var keys = words.Where((w, i) => i%2 == 0);
var values = words.Where((w, i) => i%2 != 0);
var dict = ToDictionary(keys, values);

这将为您提供所需的
StringDictionary
,而无需进行位置计算。如果你能使用
字典
,我会使用它和其他发布的解决方案之一

var types = new StringDictionary();
using (IEnumerator<string> enumerator = streetTypes.Split('|').AsEnumerable().GetEnumerator())
{
    while(enumerator.MoveNext())
    {
        string first = enumerator.Current;
        if (!enumerator.MoveNext()) 
            break;
        types.Add(first, enumerator.Current);
    }
}
var types=newstringdictionary();
使用(IEnumerator enumerator=streetTypes.Split(“|”).AsEnumerable().GetEnumerator())
{
while(枚举数.MoveNext())
{
string first=枚举数.Current;
如果(!enumerator.MoveNext())
打破
添加(第一个,枚举器.Current);
}
}

字符串实际上是实现中的常量吗?我认为字典的集合初始值设定应该相当整洁…同意。绝对是最好的选择。如果范围包含
x.Length/2
项和选定的索引
2*x
2*x+1
,则此选项有效(方便)。如果没有,它可能首先会因为一个断言而悲惨地死去。这不起作用,它将创建n-1个元素({0,1},{1,2},{2,3}…),OP想要的是n/2({0,1},{2,3},{4,5}…)。Gotcha现在有意义了-将快速修复代码。我说过我半睡了:)修好了!谢谢大家的提醒-谢谢。通常,单元测试会发现(糟糕的借口;-))这不会生成StringDictionary。@neontapir:同意-可以说,如果OP想使用Linq,他无论如何都应该使用
字典
var types = new StringDictionary();
using (IEnumerator<string> enumerator = streetTypes.Split('|').AsEnumerable().GetEnumerator())
{
    while(enumerator.MoveNext())
    {
        string first = enumerator.Current;
        if (!enumerator.MoveNext()) 
            break;
        types.Add(first, enumerator.Current);
    }
}