Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq中的null处理_C#_Linq_Null - Fatal编程技术网

C# Linq中的null处理

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() {

我是linq的新手,这会一直出现在空卷字段中。该文件是不可预测的,并且会发生这种情况,因此我想在出现异常的地方添加一个0。有没有快速简便的方法

     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 //