2

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

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

我这样做的最初方法只是循环遍历值并检查唯一值列表是否包含该值,但这需要很长时间,我想利用 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 个值来自服务器,这些值对返回的值有限制,但是它适用于此并且不应该对我尝试的内容产生影响在这里做。

4

2 回答 2

3

您不能.ToString()为空值。看起来你可能正在尝试。null 的候选人包括lstbxFields.SelectedValue,g.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));
于 2012-08-08T22:45:28.977 回答
-1

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

处理类型化对象不仅更安全,而且速度更快,代码更短。

于 2012-08-08T22:57:37.140 回答