2017-04-04 83 views
0

我必须把的XElement的XElement与值[ABC INC,假]进入Dictionary<string, bool?>Lambda表达式添加的XElement到字典

我结束了一段代码:

Dictionary<string, bool?> LogicalDistinctValues; 
      foreach (XElement xelement in lvalues.Elements()) 
      { 
       string[] vals = xelement.Value.Replace("[", string.Empty).Replace("]", string.Empty).Split(','); 
       if (vals.Count() == 2) 
       { 
        string val; 
        bool lval; 
        val = vals[0]; 
        if(bool.TryParse(vals[1], out lval)) 
        { 
         LogicalDistinctValues.Add(val, lval); 
        } 
        else 
        { 
         LogicalDistinctValues.Add(val, true); 
        } 
       } 
      } 

是否有可能取代它用lambda表达式?

+1

在Split()之前不需要'ToString()', – xanatos

回答

2

我做得难看这里的东西,你不应该永远做。这段代码比你的代码慢,而且比较丑。

bool lval; 

Dictionary<string, bool?> LogicalDistinctValues = 
    (from xelement in lvalues.Elements() 
     let vals = xelement.Value.Replace("[", string.Empty).Replace("]", string.Empty).Split(',') 
     where vals.Length == 2 
     select new { Key = vals[0], Value = bool.TryParse(vals[1], out lval) ? (bool?)lval : true } 
    ).ToDictionary(x => x.Key, x => x.Value); 
} 

注意,我做坏事......我做了out一个局部变量。这在LINQ表达式中通常在道德上是错误的。

作为旁注,您使用了无用的.ToString()而不是.Count()您应该使用.Length作为数组。

请注意,我从头开始创建Dictionary<>。如果你需要添加元素到一个已经存在的数组中,那么你不能直接在LINQ中完成它(因为Dictionary<>没有AddRange)...你可以做一个foreach,结果是select

var exp = from xelement in lvalues.Elements() 
      let vals = xelement.Value.Replace("[", string.Empty).Replace("]", string.Empty).Split(',') 
      where vals.Length == 2 
      select new { Key = vals[0], Value = bool.TryParse(vals[1], out lval) ? (bool?)lval : true }; 

foreach (var kv in exp) 
{ 
    LogicalDistinctValues.Add(kv.Key, kv.Value); 
} 
2

我想你可以做这样的事情。这是一个有点难看,但这样你会做一气呵成:

bool lval; 
var LogicalDistinctValues= (
     from xelement in lvalues.Elements() 
     let vals = xelement.Value.Replace("[", string.Empty).Replace("]", string.Empty).ToString().Split(',') 
     where vals.Count() ==2 
     select new 
     { 
      Key= vals[0], 
      Value=bool.TryParse(vals[1],out lval)?lval:true 
     } 
    ).ToDictionary (l =>l.Key,l=>l.Value);