简化和组合LINQ语句

时间:2018-10-24 07:07:58

标签: c# linq dictionary

我目前正在开发.NET Framework 4.7.2应用程序。我编写了LINQ语句,以使用给定结构从keyValuePair检索值。该值是object类型的,可以为true,false或“ 0”。

keyValuePair包含一个Dictionary<string, object>,看起来类似于以下内容:

enter image description here

  • 键:“ IsFruit”值:true
  • 键:“ IsVegetable”值:false
  • 键:“ IsMeat”值:“ 0”

我只想选择布尔值。我的用于查询值的LINQ查询如下所示:

var val = fruitOrVegetable
    .Where(pair => pair.Key == "IsFruit")
    .FirstOrDefault().Value;

bool isFruitAtPosition;
bool.TryParse(val.ToString(), out isFruitAtPosition);

实际上,我的代码可以正常工作,只是,我对此不太满意,我在想也许有一种方法可以将这些行合并/组合为1条语句或其他内容。

您对如何改善查询有一些想法吗?

5 个答案:

答案 0 :(得分:2)

您始终可以使用自己的扩展方法将对象转换为bool或null。

例如

public static bool? AsBoolOrDefault(this object objectToParse)
{
    return objectToParse is bool ? objectToParse as bool? : null;
}   

并在查询中使用它,例如

bool? isFruitAtPosition = fruitOrVegetable.Where(pair => pair.Key == "IsFruit")
                                          .FirstOrDefault().Value.AsBoolOrDefault()

您不仅可以在查询中使用它,而且可以在任何地方使用它。

  

非主题

如果在使用FirstOrDefaut和其他可为空的选择方法后使用use访问任何属性或方法,则您正在调用NullReferenceException。我认为进行空检查通常是个好主意。

在C#6中,您可以使用Null条件运算符。

bool? isFruitAtPosition = fruitOrVegetable.Where(pair => pair.Key == "IsFruit")
                                          .FirstOrDefault()?.Value.AsBoolOrDefault()

答案 1 :(得分:1)

这是一本字典...您不需要LINQ。

如果您只需要知道该职位是否存在,那么:

bool isFruitAtPosition = fruitOrVegetable.ContainsKey("IsFruit")? fruitOrVegetable["IsFruit"] as bool? ?? false : false;

或者,如果您确实需要两个变量:

var val = fruitOrVegetable.ContainsKey("IsFruit")? fruitOrVegetable["IsFruit"] : new object();
bool isFruitAtPosition = val as bool? ?? false;

根据您的实际代码库,随意将其重新混合为更具可读性的内容。如果字典很小,则迭代之间不会有太大区别。如果它很大或对性能有隐性影响,这将是使用的关键方法。

答案 2 :(得分:1)

我喜欢这个版本。

var isFruitAtPosition = fruitOrVegetable.Any( p => p.Key == "IsFruit" && (bool)p.Value );

答案 3 :(得分:1)

我认为您可以按以下方式使用LINQ:

var val = fruitOrVegetable.FirstOrDefault(item => item.key == "IsFruit");

然后您可以尝试将其转换为bool。

只是想一想:如果Key:“ IsMeat”的值是0或1,就不能将其设置为bool类型。

答案 4 :(得分:0)

这是您可以使用的一种很好的扩展方法,它是通用的,可以用于其他类型,然后是bool / bool?:

public class Program
{

 public static void Main()
 {
    var dict = new Dictionary<string, object>{
        {"test1", true},
        {"test2", 2}
    };

    var result = dict.GetDictionaryItemValueOrDefault<bool?>("test1");
    Console.WriteLine(result.ToString());
 }
}

public static class Extensions{
 public static T GetDictionaryItemValueOrDefault<T>(this Dictionary<string, object> dictionary, string key){    
    if(!dictionary.TryGetValue(key, out var result) || !(result is T))
       return default(T);

    return (T)result;
 }  
}