【问题标题】:Linq to Object gives "Specified argument was out of the range of valid values."Linq to Object 给出“指定的参数超出了有效值的范围。”
【发布时间】:2018-02-15 18:59:41
【问题描述】:

我有一些从 API 调用中以 JSON 形式检索的数据。数据被检索并转换为对象,但我无法可靠地访问我需要的数据。我需要查询对象以确定值是否存在,但是当值不存在时,我会收到各种错误消息。我正在尝试选择第一个 ColData 等于给定字符串的行。

// When the string does not exist I get 
// Specified argument was out of the range of valid values.
var t1 = PriorMonthTB.Rows.Row.Where( d => d.ColData[ 0 ].Value.Contains( "sdfasfd" ) ).Any(); 
var t2 = PriorMonthTB.Rows.Row.FirstOrDefault( d => d.ColData[ 0 ].Value.Contains( "sdfasfd" ) );
var t3 = PriorMonthTB.Rows.Row.Any( d => d.ColData[ 0 ].Value.Contains( "sdfasfd" ) );
var t5 = PriorMonthTB.Rows.Row.Where( r => r.ColData[ 0 ].Value == "sdfasfd" ).FirstOrDefault().ColData.FirstOrDefault().Value;

这有效……有时。这在一个循环内运行。第一次迭代有效,但后续迭代返回“false”,即使它们应该返回 true。

var t4 = PriorMonthTB.Rows.Row.Select( d => d.ColData[ 0 ].Value.Contains( "sdfasfd" ) ).FirstOrDefault();

其他尝试给Sequence contains no elements

我要查询的对象看起来像这样

public partial class TrialBalance : RealmObject
{        
    [JsonProperty( "Header" )]
    public Header Header { get; set; }

    [JsonProperty( "Columns" )]
    public Columns Columns { get; set; }

    [JsonProperty( "Rows" )]
    public Rows Rows { get; set; }
}

public partial class Columns : RealmObject
{
    [JsonProperty( "Column" )]
    public IList<Column> Column { get; }
}

public partial class Column : RealmObject
{
    [JsonProperty( "ColTitle" )]
    public string ColTitle { get; set; }

    [JsonProperty( "ColType" )]
    public string ColType { get; set; }
}

public partial class Header : RealmObject
{
    [JsonProperty( "Time" )]
    public DateTimeOffset Time { get; }

    [JsonProperty( "ReportName" )]
    public string ReportName { get; set; }

    [JsonProperty( "DateMacro" )]
    public string DateMacro { get; set; }

    [JsonProperty( "ReportBasis" )]
    public string ReportBasis { get; set; }

    [JsonProperty( "StartPeriod" )]
    public DateTimeOffset StartPeriod { get; set; }

    [JsonProperty( "EndPeriod" )]
    public DateTimeOffset EndPeriod { get; set; }

    [JsonProperty( "Currency" )]
    public string Currency { get; set; }

    [JsonProperty( "Option" )]
    public IList<Option> Option { get; }
}

public partial class Option : RealmObject
{
    [JsonProperty( "Name" )]
    public string Name { get; set; }

    [JsonProperty( "Value" )]
    public string Value { get; set; }
}

public partial class Rows : RealmObject
{
    [JsonProperty( "Row" )]
    public IList<Row> Row { get; }
}

public partial class Row : RealmObject
{
    [JsonProperty( "ColData" )]
    public IList<RowColDatum> ColData { get; }

    [JsonProperty( "Summary" )]
    public Summary Summary { get; set; }

    [JsonProperty( "type" )]
    public string Type { get; set; }

    [JsonProperty( "group" )]
    public string Group { get; set; }
}

public partial class RowColDatum : RealmObject
{
    [JsonProperty( "value" )]
    public string Value { get; set; }

    [JsonProperty( "id" )]
    public string Id { get; set; }
}

public partial class Summary : RealmObject
{
    [JsonProperty( "ColData" )]
    public IList<SummaryColDatum> ColData { get; }
}

public partial class SummaryColDatum : RealmObject
{
    [JsonProperty( "value" )]
    public string Value { get; set; }
}

我不认为这会如此令人头疼,但我无法让它发挥作用。谁能告诉我我做错了什么?

【问题讨论】:

  • 什么是返回真或假?此外,如果您打算选择 d.ColData[ 0 ].Value.Contains( "sdfasfd" ) 的第一行或默认行,最好执行 PriorMonthTB.Rows.Row.FirstOrDefault( d => d.ColData[ 0 ] .Value.Contains("sdfasfd"));
  • 你试过用 FirstOrDefault 代替 ColData[0] 吗?
  • @touchofevil 我试过var t1 = PriorMonthTB.Rows.Row.FirstOrDefault( d =&gt; d.ColData[ 0 ].Value.Contains( "sdfasfd" ) );,我得到Specified argument was out of the range of valid values. Parameter name: Get from RealmList index:0 beyond range of:0
  • @user6144226 我试过了,错误是Object reference not set to an instance of an object.
  • @mack - 是的,想了很多,你需要投资大量的空条件运算符(几乎在每个点上) - 这不是走的路。您的数据根本不包含 ColData 有多合理?您是否反序列化了正确的对象?

标签: c# json linq


【解决方案1】:

在执行“包含”测试之前尝试检索第一个项目之前,您可以尝试检查 d.ColData 是否有一组有效的项目。

我还会检查字符串的值(即 d.ColData[0].Value)是否不为空,否则在执行“包含”测试时会收到 NullReferenceException。

var t1 = PriorMonthTB.Rows.Row.Any(d => d.ColData.Any() &&
                                        d.ColData[0].Value != null &&
                                        d.ColData[0].Value.Contains("sdfasfd"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多