C# Linq中的null处理
我是linq的新手,这会一直出现在空卷字段中。该文件是不可预测的,并且会发生这种情况,因此我想在出现异常的地方添加一个0。有没有快速简便的方法C# Linq中的null处理,c#,linq,null,C#,Linq,Null,我是linq的新手,这会一直出现在空卷字段中。该文件是不可预测的,并且会发生这种情况,因此我想在出现异常的地方添加一个0。有没有快速简便的方法 var qry = from line in File.ReadAllLines("C:\\temp\\T.txt") let myRecX = line.Split(',') select new myRec() {
var qry =
from line in File.ReadAllLines("C:\\temp\\T.txt")
let myRecX = line.Split(',')
select new myRec()
{
price = Convert.ToDecimal( myRecX[0].Replace("price = ", "")) ,
volume = Convert.ToInt32(myRecX[1].Replace("volume =", "")),
dTime = Convert.ToDateTime( myRecX[2].Replace("timestamp =", ""))
};
如果您希望在传入数据为
null
、为空或完全由空白字符组成时使用默认值,可以这样做:
volume = string.IsNullOrWhitesplace(myRecX[1])
? defaultVolume // <<== You can use any constant here
: Convert.ToInt32(myRecX[1].Replace("volume =", ""))
volume=string.isnullorwhiteplace(myRecX[1])
? defaultVolume/如果要在传入数据为空、空或完全由空白字符组成时使用默认值,可以这样做:
volume = string.IsNullOrWhitesplace(myRecX[1])
? defaultVolume // <<== You can use any constant here
: Convert.ToInt32(myRecX[1].Replace("volume =", ""))
volume=string.isnullorwhiteplace(myRecX[1])
? defaultVolume/您可以使用类似这样的内容,它提供了一种表达方式来编写所需内容:
static TOutput Convert<TInput, TOutput>(
TInput value,
params Func<TInput, TOutput>[] options)
{
foreach (var option in options) {
try { return option(value); }
catch { }
}
throw new InvalidOperationException("No option succeeded.");
}
函数间接寻址和隐式数组构造可能会带来轻微的性能损失,但它为您提供了一种很好的语法,可以用它指定许多可能的转换,其中第一次转换成功。您可以使用类似的方法,它提供了一种表达方式来编写所需的内容:
static TOutput Convert<TInput, TOutput>(
TInput value,
params Func<TInput, TOutput>[] options)
{
foreach (var option in options) {
try { return option(value); }
catch { }
}
throw new InvalidOperationException("No option succeeded.");
}
函数间接寻址和隐式数组构造可能会带来轻微的性能损失,但它提供了一种很好的语法,可以用它指定许多可能的转换,其中第一次转换成功。我认为这里有一个问题超出了Linq
的使用范围
通常,在清理文件数据之前对其进行操作是不好的做法
即使以下问题是关于文件名(而不是其内容)的,也是理解消毒输入概念的良好起点:
在您自己告诉您的代码缺乏对文件内容的控制之后,所以在调用之前:
让myRecX=line.Split(',')
我建议定义一个私有方法,如:
string SanitizeInputLine(string input) {
// here do whatever is needed to bring back input to
// a valid format in a way that subsequent calls will not
// fail
return input;
}
应用它很简单
让myRecX=SanitizeInputLine(line).Split(',')
一般来说,不要相信输入。
让我引用第10章的话,名字是“所有的输入都是邪恶的!”霍华德/勒布朗的作品:
…在验证数据之前,您不应信任数据。做不到
因此将使您的应用程序易受攻击。或者,换一种说法:全部
除非证明不是这样,否则输入是邪恶的
我认为这里有一个问题超出了使用Linq
通常,在清理文件数据之前对其进行操作是不好的做法
即使以下问题是关于文件名(而不是其内容)的,也是理解消毒输入概念的良好起点:
在您自己告诉您的代码缺乏对文件内容的控制之后,所以在调用之前:
让myRecX=line.Split(',')
我建议定义一个私有方法,如:
string SanitizeInputLine(string input) {
// here do whatever is needed to bring back input to
// a valid format in a way that subsequent calls will not
// fail
return input;
}
应用它很简单
让myRecX=SanitizeInputLine(line).Split(',')
一般来说,不要相信输入。
让我引用第10章的话,名字是“所有的输入都是邪恶的!”霍华德/勒布朗的作品:
…在验证数据之前,您不应信任数据。做不到
因此将使您的应用程序易受攻击。或者,换一种说法:全部
除非证明不是这样,否则输入是邪恶的
我会考虑使用正则表达式。您是否得到空引用异常或数组索引越界异常?“我想在有异常的地方加上0”这似乎是个坏主意?为什么您更喜欢损坏的数据而不是错误?@DanielA.White“有些人在遇到问题时会认为‘我知道,我会使用正则表达式。’现在他们有两个问题。”;)如果存在数据线,则需要0。它来自的系统我无法控制。零长度字符串是ErrRIO会考虑使用正则表达式。是否得到空引用异常或数组索引越界异常?“我想在有异常的地方加上0”这似乎是个坏主意?为什么您更喜欢损坏的数据而不是错误?@DanielA.White“有些人在遇到问题时会认为‘我知道,我会使用正则表达式。’现在他们有两个问题。”;)如果存在数据线,则需要0。它来自的系统我无法控制。长度为零的字符串是一个错误,我不得不将替换功能添加到两个比较中,但工作起来就像一个charm volume=string.IsNullOrWhiteSpace(myRecX[1].replace(“volume=,”))?0//Beautiful,我不得不将替换功能添加到两个比较中,但工作起来就像一个charm volume=string.IsNullOrWhiteSpace(myRecX[1].replace(“volume=,”)?0 //