C# LINQ-“;索引超出了数组的边界。”;
我得到这个错误: “索引超出了数组的边界。” 通过使用这个LINQ查询 我想,如果A.LogOutTime返回null,则显示“未知”C# LINQ-“;索引超出了数组的边界。”;,c#,linq,C#,Linq,我得到这个错误: “索引超出了数组的边界。” 通过使用这个LINQ查询 我想,如果A.LogOutTime返回null,则显示“未知” 如何解决这个问题?问题是,当A.LogOutTime为null时,您将字符串“Unknown”放在返回的IEnumerable的某些索引处,然后将其拆分为“”。这些索引不存在,因此会出现该错误 我建议您执行以下操作: 使用let,这样就不会每次重复拆分。拆分时使用C#6.0?。以避免出现NullReferenceException(如果LogOutTime为空,
如何解决这个问题?问题是,当
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
astring
而不是DateTime
?@AbhilashJA不这样做。这是一个严重的错误。将其另存为datetime
。即使您不想修复该bug,也要解析日期字符串而不是拆分。您可以使用DateTime.date
和DateTime.TimeOfDay
检索DateTime的日期和时间部分。这与LINQ无关。检查你的数组,你在某些地方使用了错误的索引。也许,尝试访问空数组中的项目?将其拆分为更易于管理的项目?乍一看,您有很多索引到数组中,但这些数组不能保证包含那么多的项(例如,如果为null,则设置为“未知”,在拆分时,它将只包含一个项-尝试获取项1或2将失败,但出现此异常)。如果拆分为“未知”在空间中,您将得到一个只有一个值的数组。还有为什么LogOutTime
astring
而不是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();