检查不同的空值

时间:2012-08-08 22:42:45

标签: c# silverlight linq

我已经尝试了很多不同的方法来做到这一点,但每次我尝试它时都会抛出一个空引用异常。

我正在尝试过滤字段中的值,以获得该字段内唯一值的列表。它适用于没有缺失值的字段,但是当我在我知道具有空值的字段上使用它时,它会抛出异常,所以我假设这是我应该过滤的内容。

我这样做的原始方式只是循环遍历值并检查唯一值列表是否包含值但是这需要很长时间,我想利用Linq的力量

List<Graphic> ReturnedGraphics = e.FeatureSet.Features as List<Graphic>;


IEnumerable<string> ValueSet = (
                                 from g in e.FeatureSet.Features
                                 where !uniquevalues.Contains((g.Attributes[_selectedField] == null ? "blank" : g.Attributes[_selectedField].ToString()))
                                 select g.Attributes[_selectedField] == null ? "blank" : g.Attributes[_selectedField].ToString()
                               ) as IEnumerable<string>;

if (ValueSet.Any())
{
    uniquevalues.AddRange(ValueSet);
}

我还应该补充一点,我在列表中添加一个范围的原因是因为有5000个值来自服务器,它有一个限制值要返回,但它适用于此并且不应该对我想在这做什么。

2 个答案:

答案 0 :(得分:3)

您不能.ToString()空值。看起来你可能会尝试。 null的候选人包括lstbxFields.SelectedValueg.Attributes[someVal]

如何合理化代码以便错误更容易陷入错误并且您不会在整个地方重复自己?

var selVal = lstbxFields.SelectedValue;
if(selVal == null)
{
    //act on this
    return; //or throw
}
var selectedValue = selVal.ToString();

var query=
    e.FeatureSet.Features
        .Select(feature => feature.Attributes[selectedValue])
        .Select(attr => attr == null 
                        ? "blank" 
                        : attr.ToString())
        .Where(attrVal => !uniquevalues.Contains(attrVal));

答案 1 :(得分:-1)

您的数据模型几乎肯定是“错误的”,因为它非常容易出错并且难以使用。您不应该将所有内容转换为string,而是直接处理强类型对象。这样做可能会自动修复此错误,因为当您尝试ToString一个空值时,很可能会抛出NullReferenceException。

处理打字对象不仅更安全,而且速度更快,代码更短。