C# LINQ-“;索引超出了数组的边界。”;

C# LINQ-“;索引超出了数组的边界。”;,c#,linq,C#,Linq,我得到这个错误: “索引超出了数组的边界。” 通过使用这个LINQ查询 我想,如果A.LogOutTime返回null,则显示“未知” 如何解决这个问题?问题是,当A.LogOutTime为null时,您将字符串“Unknown”放在返回的IEnumerable的某些索引处,然后将其拆分为“”。这些索引不存在,因此会出现该错误 我建议您执行以下操作: 使用let,这样就不会每次重复拆分。拆分时使用C#6.0?。以避免出现NullReferenceException(如果LogOutTime为空,

我得到这个错误:

“索引超出了数组的边界。”

通过使用这个LINQ查询

我想,如果A.LogOutTime返回null,则显示“未知”


如何解决这个问题?

问题是,当
A.LogOutTime
null
时,您将字符串
“Unknown”
放在返回的
IEnumerable
的某些索引处,然后将其拆分为
”。这些索引不存在,因此会出现该错误

我建议您执行以下操作:

  • 使用
    let
    ,这样就不会每次重复拆分。拆分时使用C#6.0
    ?。
    以避免出现
    NullReferenceException
    (如果
    LogOutTime
    为空,
    部分也将为空)
  • 分配给属性时,检查
    LogOutTime
    是否为
    null
    ,如果为空,则分配
    “未知”
    。如果不是,则根据需要使用拆分结果
  • 使用
    ElementAtOrDefault(n)
    不访问不存在的索引
  • 因此:


    另外,通过检查
    LogOutTime
    是否为
    null
    ,我假定它是
    字符串。相反,将其保存为
    DateTime
    ,这样您就不会有拆分和访问不存在的索引的问题。使用
    DateTime
    的不同属性或指定所需格式的
    ToString()
    重载。有关此问题的更多信息:

    问题在于,当
    A.LogOutTime
    null
    时,您将字符串
    “Unknown”
    放置在返回的
    IEnumerable
    的某些索引处,然后将其拆分为
    ”。这些索引不存在,因此会出现该错误

    我建议您执行以下操作:

  • 使用
    let
    ,这样就不会每次重复拆分。拆分时使用C#6.0
    ?。
    以避免出现
    NullReferenceException
    (如果
    LogOutTime
    为空,
    部分也将为空)
  • 分配给属性时,检查
    LogOutTime
    是否为
    null
    ,如果为空,则分配
    “未知”
    。如果不是,则根据需要使用拆分结果
  • 使用
    ElementAtOrDefault(n)
    不访问不存在的索引
  • 因此:

    另外,通过检查
    LogOutTime
    是否为
    null
    ,我假定它是
    字符串。相反,将其保存为
    DateTime
    ,这样您就不会有拆分和访问不存在的索引的问题。使用
    DateTime
    的不同属性或指定所需格式的
    ToString()
    重载。有关此问题的更多信息:

    使用“let”关键字只拆分一次注销时间部分。然后在计算AccessTimeFrame时检查部件的长度

    var listItems = (from A in data
                        let logOutTimeParts = (A.LogOutTime ?? "Unknown").Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                        orderby A.FirstName
                        select new
                        {
                            Action = "Logout",
                            UserName = A.FirstName + " " + A.SurName,
                            ID = A.Id,
                            AccessDate = logOutTimeParts[0],
                            AccessTimeFrame = logOutTimeParts.Length >= 3 ? logOutTimeParts[1] + " " + logOutTimeParts[2] : "",
                            Comment = "Never delete this Archive"
                        }
        ).Distinct();
    
    使用“let”关键字只拆分一次注销时间部分。然后在计算AccessTimeFrame时检查部件的长度

    var listItems = (from A in data
                        let logOutTimeParts = (A.LogOutTime ?? "Unknown").Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                        orderby A.FirstName
                        select new
                        {
                            Action = "Logout",
                            UserName = A.FirstName + " " + A.SurName,
                            ID = A.Id,
                            AccessDate = logOutTimeParts[0],
                            AccessTimeFrame = logOutTimeParts.Length >= 3 ? logOutTimeParts[1] + " " + logOutTimeParts[2] : "",
                            Comment = "Never delete this Archive"
                        }
        ).Distinct();
    

    这与林克无关。检查你的数组,你在某些地方使用了错误的索引。也许,尝试访问空数组中的项目?将其拆分为更易于管理的项目?乍一看,您有很多索引到数组中,但这些数组不能保证包含那么多的项(例如,如果为null,则设置为“未知”,在拆分时,它将只包含一个项-尝试获取项1或2将失败,但出现此异常)。如果拆分为“未知”在空间中,您将得到一个只有一个值的数组。还有为什么
    LogOutTime
    a
    string
    而不是
    DateTime
    ?@AbhilashJA不这样做。这是一个严重的错误。将其另存为
    datetime
    。即使您不想修复该bug,也要解析日期字符串而不是拆分。您可以使用
    DateTime.date
    DateTime.TimeOfDay
    检索
    DateTime的日期和时间部分。这与LINQ无关。检查你的数组,你在某些地方使用了错误的索引。也许,尝试访问空数组中的项目?将其拆分为更易于管理的项目?乍一看,您有很多索引到数组中,但这些数组不能保证包含那么多的项(例如,如果为null,则设置为“未知”,在拆分时,它将只包含一个项-尝试获取项1或2将失败,但出现此异常)。如果拆分为“未知”在空间中,您将得到一个只有一个值的数组。还有为什么
    LogOutTime
    a
    string
    而不是
    DateTime
    ?@AbhilashJA不这样做。这是一个严重的错误。将其另存为
    datetime
    。即使您不想修复该bug,也要解析日期字符串而不是拆分。您可以使用
    DateTime.date
    DateTime.TimeOfDay
    检索
    DateTime的日期和时间部分
    
    var listItems = (from A in data
                        let logOutTimeParts = (A.LogOutTime ?? "Unknown").Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                        orderby A.FirstName
                        select new
                        {
                            Action = "Logout",
                            UserName = A.FirstName + " " + A.SurName,
                            ID = A.Id,
                            AccessDate = logOutTimeParts[0],
                            AccessTimeFrame = logOutTimeParts.Length >= 3 ? logOutTimeParts[1] + " " + logOutTimeParts[2] : "",
                            Comment = "Never delete this Archive"
                        }
        ).Distinct();