天道酬勤,学无止境

是否可以用匹配特定条件的行号填充数组而不循环?(Is it possible to fill an array with row numbers which match a certain criteria without looping?)

问题

我想用仅满足特定条件的行的行号填充VBA中的数组。 我想要最快的方法(例如,类似RowArray = index(valRange=valMatch).row

以下是(慢速)范围循环的代码。

Current Code

Sub get_row_numbers()

Dim RowArray() As Long
Dim valRange As Range
Dim valMatch As String

Set valRange = ActiveSheet.Range("A1:A11")
valMatch = "aa"
ReDim RowArray(WorksheetFunction.CountIf(valRange, valMatch) - 1)

For Each c In valRange
    If c.Value = valMatch Then RowArray(x) = c.Row: x = x + 1
Next c    
End Sub
回答1

仍然是Chris高效变体阵列时间的2-3倍,但该技术功能强大,并且已超出了此问题的应用范围

需要注意的一点是Application.Transpose限制为65536个单元,因此需要将更长的范围“分块”成碎片。

Sub GetEm()
Dim x
x = Filter(Application.Transpose(Application.Evaluate("=IF(A1:A50000=""aa"",ROW(A1:a50000),""x"")")), "x", False)
End Sub
回答2

首先将范围复制到变量数组,然后在数组上循环

Arr = rngval
For I = 1 to ubound(arr)
    If arr(I,1) = valMatch Then RowArray(x) = I: x = x + 1
Next
回答3

问题标题中有一个假设:循环解决方案的速度很慢,非循环解决方案的速度更快。 因此,我进行了一些比较以确认这一点。

测试用例

我创建了一些样本数据,其中包含50,000个样本和50%的匹配值。 对于最快的方法,我又创建了两个样本集,再次有50,000行,一个具有10%匹配行,另一个具有90%匹配行。

我将每个发布的方法循环运行在此数据上,重复逻辑10次(因此,用于处理总共500,000行)。

                  50%        10%        90%  
ExactaBox        1300       1240       1350  ms
Scott Holtzman 415000         
John Bustos     12500       
Chris neilsen     310        310        310
Brettdj           970        970        970
OP               1530       1320       1700

因此,道义很明确:仅仅因为它包含一个循环就不会使其变慢。 什么慢是获得工作表,所以你应该尽一切努力,以尽量减少。

更新添加了Brettdj注释的测试:单行代码

为了完整起见,这是我的解决方案

Sub GetRows()
    Dim valMatch As String
    Dim rData As Range
    Dim a() As Long, z As Variant
    Dim x As Long, i As Long
    Dim sCompare As String

    Set rData = Range("A1:A50000")
    z = rData
    ReDim a(1 To UBound(z, 1))
    x = 1
    sCompare = "aa"
    For i = 1 To UBound(z)
        If z(i, 1) = sCompare Then a(x) = i: x = x + 1
    Next
    ReDim Preserve a(1 To x - 1)    
End Sub
回答4

基于其他人在这里提供的功能,我将这两种方法与一些字符串操作结合在一起,以获取任何给定范围内的准确行号,其中包含所需的匹配项而无需循环

与您的代码唯一不同的是RowArray()String类型。 但是,如果需要,您可以使用CLng将其转换为Long,因为您可以根据需要CLng数字。

Sub get_row_numbers()

Dim rowArray() As String, valRange As Range, valMatch As String
Dim wks As Worksheet, I As Long, strAddress As String    
Set wks = Sheets(1)
valMatch = "aa"

With wks    
    Set valRange = .Range("A1:A11")        
    Dim strCol As String
    strCol = Split(valRange.Address, "$")(1)
    '-> capture the column name of the evaluated range
        '-> NB -> the method below will fail if a multi column range is selected

    With valRange        
        If Not .Find(valMatch) Is Nothing Then
        '-> make sure valMatch exists, otherwise SpecialCells method will fail

            .AutoFilter 1, valMatch                    
            Set valRange = .SpecialCells(xlCellTypeVisible)
            '-> choose only cells where ValMatch is found

            strAddress = valRange.Address '-> capture address of found cells
            strAddress = Replace(Replace(strAddress, ":", ""), ",", "") '-> remove any commas and colons
            strAddress = Replace(strAddress, "$" & strCol & "$", ",") '-> replace $column$ with comma
            strAddress = Right(strAddress, Len(strAddress) - 1) '-> remove leading comma

            rowArray() = Split(strAddress, ",")

            '-> test print
            For I = 0 To UBound(rowArray())                    
                Debug.Print rowArray(I)                        
            Next

        End If 'If Not .Find(valMatch) Is Nothing Then            
    End With ' With valRange        
End With 'With wks

End Sub
回答5

您可能需要查看“查找”,“匹配”与“变体数组”,得出的结论是,除非命中密度非常低,否则变体数组方法最快。

但是,所有方法中最快的方法仅是针对排序的数据和完全匹配:使用二进制搜索找到第一个和最后一个出现的位置,然后将该数据子集放入变量数组中。

回答6

我仍然有一个循环,但是只能通过必要的行来填充数组:

Sub get_row_numbers()

Dim RowArray() As Long
Dim valRange As Range
Dim valMatch As String

Set valRange = ActiveSheet.Range("A1:A11")
valMatch = "aa"
ReDim RowArray(WorksheetFunction.CountIf(valRange, valMatch) - 1)

Dim c As Range
Dim x As Integer
Set c = valRange.Find(What:=valMatch, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlNext)

Do
  RowArray(x) = c.Row
  Set c = valRange.FindNext(after:=c)
  x = x + 1
Loop Until x = UBound(RowArray) + 1


End Sub
回答7

您在示例中对范围进行了硬编码。 右边有备用列吗? 如果是这样,您可以在右边的单元格中使用0(如果不匹配)或行号(如果不匹配)来填充。 然后将其拉入数组并进行过滤。 无循环:

Sub NoLoop()

Dim valMatch As String
Dim rData As Excel.Range, rFormula As Excel.Range
Dim a As Variant, z As Variant

    Set rData = ThisWorkbook.Worksheets(1).Range("A1:A11") 'hard-coded in original example
    Set rFormula = ThisWorkbook.Worksheets(1).Range("B1:B11") ' I'm assuming this range is currently empty
    valMatch = "aa" 'hard-coded in original example

    'if it's a valid match, the cell will state its row number, otherwise 0
    rFormula.FormulaR1C1 = "=IF(RC[-1]=""" & valMatch & """,ROW(RC),0)"

    a = Application.Transpose(rFormula.Value)
    z = Filter(a, 0, False) 'filters out the zeroes, you're left with an array of valid row numbers

End Sub

我不得不将Jon49归功于Excel Range的一维数组作为Application.Transpose技巧来获取一维数组。

回答8

大家,谢谢您的个人投入。

ExactaBox,您的解决方案对我很有帮助。 但是,通过公式返回0值存在问题

rFormula.FormulaR1C1= "=IF(RC[-1]=""" & valMatch & """,ROW(RC),0)".

由于VBA筛选器功能通过进行字符串比较来筛选出值,因此它还将筛选出其中包含零的行号。 例如,有效行号20、30、40等也应被滤除,因为它们包含零,因此最好在公式中写一个字符串来代替0,因此可以是:

rFormula.FormulaR1C1= "=IF(RC[-1]=""" & valMatch & """,ROW(RC),""Valid"")"

正如上面的brettdj所建议的那样,他使用“ x”字符串作为最后一个参数。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • PHP解析/语法错误; 以及如何解决它们(PHP parse/syntax errors; and how to solve them)
    问题 每个人都遇到语法错误。 即使是经验丰富的程序员也会打错字。 对于新手来说,这只是学习过程的一部分。 但是,通常很容易解释以下错误消息: PHP解析错误:语法错误,第20行的index.php中出现意外的'{' 意外的符号并不总是真正的罪魁祸首。 但是行号给出了从哪里开始寻找的粗略思路。 始终查看代码上下文。 语法错误通常隐藏在提到的代码行或以前的代码行中。 将您的代码与手册中的语法示例进行比较。 虽然并非每种情况都匹配。 但是,有一些常规步骤可以解决语法错误。 这些参考文献总结了常见的陷阱: 意外的T_STRING 意外的T_VARIABLE意外的'$ varname'(T_VARIABLE) 意外的T_CONSTANT_ENCAPSED_STRING意外的T_ENCAPSED_AND_WHITESPACE 意外的$ end 意外的T_FUNCTION… 意外{意外}意外(意外) 意外[意外] 意外的T_IF意外的T_FOREACH意外的T_FOR意外的T_WHILE意外的T_DO意外的T_PRINT意外的T_ECHO 意外的T_LNUMBER 出乎意料? 意外的继续(T_CONTINUE)意外的继续(T_BREAK)意外的继续(T_RETURN) 意外的'=' 意外的T_INLINE_HTML… 意外的T_PAAMAYIM_NEKUDOTAYIM… 意外的T_OBJECT
  • SHELL 超详细基础知识,适合新手小白(一)
    一.什么是shell? 在linux内核与用户直接的解释器程序; 通常指/bin/bash; 相当于操作系统的“外壳”。 二.怎么使用shell? shell的使用方式? 1. 命令行 ==交互式; 逐条解释执行,效率低 2. 脚本 == 非交互式; 批量执行,效率高; 方便在后台静悄悄地运行。 三.怎么切换shell ?怎么使用某个特定shell? 1. 通过usermod , chsh 更改登录的shell 2. 手动执行目标shell程序 /bin/sh //多数unix默认使用的shell /bin/bash //多数Linux默认使用的shell 四.交互式硬件设备 标准输入: 从该设备接收用户输入的数据 标准输出: 通过该设备向用户输出数据 标准错误: 通过该设备报告执行中的出错信息 重定向操作: 改变标准输入/输出/错误输出的方向。 五.什么是shell脚本? 写好的执行语句,能够完成特定任务的文件 创建脚步的步骤? 脚本创建三步走 1.创建文本文件; 2.添加可执行的脚步语句 3.添加x 执行权限。 六.脚本构成? 规范的脚步构成? 1. #!//脚本声明(使用哪种解释器) 2. # //注释信息(步骤, 思路,用途,变量含义等) 3. 可执行语句 七.脚本怎么执行? 脚本执行有哪几种方式? 1. 作为命令 /命令字; 指定脚本文件的路径,前提是有x 权限 2
  • Linux awk用法
    在学习awk之前我们应该都学过sed,grep,tr,cut等等命令,这些命令都是为了方便我们对Linux下文本和数据的处理,但是我们会发现很多时候这些命令并不能一下子就完全解决我们的需求,很多时候我们都需要使用管道符结合这些命令来使用,今天我就给大家介绍一个命令awk,他就能很好的解决我们对文本和数据处理的需求,使我们一条命令就解决很多问题。 一、awk命令简介 awk被称为文本处理三剑客之一,其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。所以说awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 二、awk命令格式及选项 语法形式awk [options] 'script' var=value file(s)awk [options] -f scriptfile var=value file(s)常用命令选项
  • shell基础使用
    2、shell 2.1、shell基础正则表达式 ​ 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。并规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式( Regular Expression ) 。 2.1.1、普通元字符 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo能匹配“z”以及“zoo”。等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。 {n}
  • Excel数组公式从入门到精通之精通篇
    上次写了篇《Excel数组公式从入门到精通之入门篇》,不觉已十多天过去了,今天补上“精通篇”。当然说“精通”可能有点过了,但是希望大家通过这两篇博文能够真正认识“数组公式”,并且在工作中使用数组公式帮我们解决实际问题。 Excel数组公式从入门到精通之精通篇 一、课程回忆 什么是数组公式呢?顾名思义就是公式中包含数组的了,详细含义请参看前文。但这里重点提醒的一点就是,如果要使用数组公式,在编辑栏输入完公式以后一定要按下“Ctrl+Shift+Enter”组合键,使编辑栏的公式处在“{}”之中。 二、数组公式继续深入 印象中是好几年前了,当时看过的一篇扫盲贴中,作者举的例子真是太实用了。具体细节记不太清楚了,大致意思就是使用函数计算1到100的和。这里同样以此为例。 1.求1到100的和 在往下看之前,大家想一下,如果让你来处理该如何来处理呢?只用一个函数解决1到100的和,当然也可以是1000、10000甚至更多。讨论具体的数值没有太大意义,此处只是希望通过此例让大家更进一步的了解数组公式的用法。 解答:{=SUM(ROW(1:100))} 问题分析:求1到100的和,答案是5050(小学生都知道^-^),但Excel必须是你告诉了它正确的方法,它才能知道。计算从1到100的和,实际上就是计算1+2+3+4+……+98+99+100,好了,答案出来了,在编辑栏中输入“=sum(1
  • 用C语言设计程序,输入一个整数N(N<100),打印N*N的环形矩阵。
    用C语言设计程序,输入一个整数N(N<100),打印N*N的环形矩阵。例如: N=3,则打印: 1 2 3 8 9 4 7 6 5 又如,N=4,则打印: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 放个图吧! 话不多数,直接上代码 我尽可能的写上注释,如果有不理解的,欢迎留言。 #include<stdio.h> main()//函数入口,主函数 { int i,j,k,l;//循环标注位 int a=1; int n; int arry[100][100];//用于存放数组 scanf("%d",&n);//接收输入的N,用于确定需要打印多少阶的矩阵 i=j=k=l=0;//统一初始化一下,避免出错 l=n;//先用 l 接收N的数值用于最后的输出 //因为接下来的操作会修改源N的值 while(1){//每完成一圈,循环一次,循环条件为一直循环, for(j=k;j<n;j++){//按要求填充第一行的矩阵,行号 i 不变,列号j自加; arry[i][j]=a; a++; } j--;//上一个循环会多加一次,这里减去 a--; for(i=k;i<n;i++){//按要求填充最右边的一列。 arry[i][j]=a; a++; } i--; a--; for(j=n-1;j>k;j--){//按要求填充最下面的一行 arry[i][j]
  • 现实世界中按位运算符的用例(Real world use cases of bitwise operators [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 4年前关闭。 改善这个问题 以下按位运算符的一些实际用例是什么? 和异或不是或者左/右移位 回答1 位字段(标志) 它们是表示状态由几个“是或否”属性定义的事物的最有效方法。 ACL是一个很好的例子; 如果您假设有4个离散权限(读,写,执行,更改策略),则最好将其存储在1个字节中,而不是浪费4个。可以将它们映射为多种语言的枚举类型,以提高便利性。 通过端口/套接字进行通信总是涉及校验和,奇偶校验,停止位,流控制算法等,这通常取决于单个字节的逻辑值,而不是数字值,因为介质一次只能传输一位。 压缩,加密两者都严重依赖于按位算法。 以deflate算法为例-一切都以位为单位,而不是以字节为单位。 有限状态机我主要是讲嵌入某种硬件中的那种,尽管它们也可以在软件中找到。 它们本质上是组合的-从字面上看它们可能会被“编译”成一堆逻辑门,因此必须将它们表示为AND , OR , NOT等。 图形这里几乎没有足够的空间可以进入在图形编程中使用这些运算符的每个区域。 XOR (或^ )在这里特别有趣,因为第二次应用相同的输入将撤消第一次。 以前的GUI过去依靠它来进行选择突出显示和其他覆盖,以消除对昂贵的重绘的需求。 它们在慢速图形协议(即远程桌面)中仍然很有用。
  • 初学者指南:什么是算法?11行伪代码给你讲明白
    算法(algorithm)就是一个过程,是一种特殊的过程。它必须描述为一个有限步骤序列,且必须在有限时间内结束。每个步骤必须是良好定义的,达到人类可用一支笔和一张纸执行它的程度。算法基于我们提供给它的输入做一些事情,并生成反映其所做工作的一些输出。算法1-1实现了我们前面描述的过程。算法1-1 一个简单的股票跨度算法SimpleStockSpan(quotes)→spans输入: quotes,保存n个股票报价的数组输出: spans,保存n个股票跨度的数组 1spans←CreateArray(n) 2for i←0 to n do 3 k←1 4 span_end ← FALSE 5 while i-k ≥ 0 and not span_end do 6 if quotes[i-k] ≤ quotes[i] then 7 k←k+1 8 else 9 span_end ← TRUE10 spans[i] ← k11return spans算法1-1展示了如何描述算法。我们并不使用某种计算机语言,因为那样会迫使我们处理与算法逻辑无关的实现细节,我们使用的是某种伪代码(pseudocode)形式。伪代码是一种介于真正的程序代码和非形式化描述之间的形式。它使用一种结构化格式,并采用一组具有特定含义的词汇。但是,伪代码不是真正的计算机代码。它并不是为了被计算机执行,而是易于被人类理解
  • 有效请求但数据为空的正确REST响应代码是什么?(What is the proper REST response code for a valid request but an empty data?)
    问题 例如,您为users/9运行GET请求,但是没有ID为#9的用户。 最好的响应码是哪一个? 200 OK 202接受 204没有内容 400错误的要求找不到404 回答1 TL; DR:使用404 请参阅此博客。 它解释得很好。 博客对204的评论摘要: 204 No Content并不是非常有用的浏览器响应代码(尽管根据HTTP规范,浏览器确实需要将其理解为“不要更改视图”响应代码)。 204 No Content然而,为此可能要表示成功,而不必返回一些AJAX的Web服务是非常有用的。 (特别是在不需要反馈的情况下,例如DELETE或POST )。 因此,对您的问题的答案是在您的情况下使用404 。 204是一个专门的响应代码,您不应该经常响应GET返回到浏览器。 其他响应代码甚至比204和404更不合适: 成功获取的任何内容都应返回200 。 当您要获取的实体不存在时,此方法不合适。 服务器开始对某个对象进行工作但该对象尚未完全准备就绪时,使用202 。 当然这里不是这样。 您尚未开始也不会开始响应GET请求构造用户9。 这违反了各种规则。 400用于响应格式不正确的HTTP请求(例如,格式不正确的HTTP标头,顺序错误的段等)。 几乎可以肯定,这将由您使用的任何框架来处理。 除非您是从头开始编写自己的服务器,否则不必处理这个问题。 编辑
  • 非穷举模式的更好例外,以防万一(Better exception for non-exhaustive patterns in case)
    问题 当GHCi在运行时发现调用产生的值与函数的模式匹配不匹配时,是否有办法使GHCi产生更好的异常消息? 当前,它给出了产生非穷尽模式匹配的函数的行号,尽管有时很有帮助,但确实需要进行一轮调试,有时我觉得自己反复进行相同的设置。 因此,在尝试提出解决方案之前,我想看看是否还存在其他问题。 除了给出行号之外,还会显示一条异常消息,该异常消息还表明它尝试拨打哪种电话? 这有可能吗? 回答1 尝试在ghci中打开警告。 例如,这可以通过传递-W启用ghc可获得的编译时警告。 您可以通过以下几种方法执行此操作: ghci -fwarn-incomplete-patterns 或者尼尔·米切尔(Neil Mitchell)描述他如何在自己的.ghci文件中进行设置。 以下是相关摘录: :set -fwarn-incomplete-patterns 您也可以在ghci上手动输入此名称,但是每次启动时都很难这样做。 以这种方式输入,仅适用于在提示符下输入的语句,不适用于使用:l加载文件。 相反,您可以将此注释放在要警告不完整模式的文件的顶部: {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} 回答2 我认识到这对您的问题没有答案,但是我的印象是,在资深的Haskell程序员中,人们普遍达成共识,即应该首先避免使用非穷举模式,甚至要避免使用
  • Excel-VBA-在数据域数组中插入新的第一列,而无需循环或API调用(Excel-VBA - Insert new first column in datafield array without loops or API calls)
    问题 介绍 去年@PrzemyslawRemin提出了一个问题,即如何在没有附加循环且不修改工作表的情况下向VBA中的现有矩阵添加计数器列。 此示例中的原始矩阵是(源单元格仅包含其地址字符串;插入的行将用数字填充)的结果(基于1的2维)数据字段数组 Dim matrix As Variant matrix = Range("A1:C5").value 输入矩阵:------------▼所需结果: +----+----+----+ +----+----+----+----+ | A1 | B1 | C1 | | 1 | A1 | B1 | C1 | +----+----+----+ +----+----+----+----+ | A2 | B2 | C2 | | 2 | A2 | B2 | C2 | +----+----+----+ +----+----+----+----+ | A3 | B3 | C3 | | 3 | A3 | B3 | C3 | +----+----+----+ +----+----+----+----+ | A4 | B4 | C4 | | 4 | A4 | B4 | C4 | +----+----+----+ +----+----+----+----+ | A5 | B5 | C5 | | 5 | A5 | B5 | C5 | +----+----+---
  • 为什么处理排序数组要比处理未排序数组快?(Why is processing a sorted array faster than processing an unsorted array?)
    问题 这是一段C ++代码,显示了一些非常特殊的行为。 出于某些奇怪的原因,奇迹般地对数据进行排序使代码快了将近六倍: #include <algorithm> #include <ctime> #include <iostream> int main() { // Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256; // !!! With this, the next loop runs faster. std::sort(data, data + arraySize); // Test clock_t start = clock(); long long sum = 0; for (unsigned i = 0; i < 100000; ++i) { // Primary loop for (unsigned c = 0; c < arraySize; ++c) { if (data[c] >= 128) sum += data[c]; } } double elapsedTime = static_cast<double>(clock() - start
  • 如何同步承诺序列?(How to synchronize a sequence of promises?)
    问题 我有一个promise对象数组,必须按照它们在数组中列出的顺序进行解析,即在解析前一个元素之前,我们无法尝试解析元素(如Promise.all([...])方法Promise.all([...]) )。 而且,如果一个元素被拒绝,则我需要链立即拒绝,而无需尝试解决以下元素。 如何实现此功能,或者是否存在此类sequence模式的现有实现? function sequence(arr) { return new Promise(function (resolve, reject) { // try resolving all elements in 'arr', // but strictly one after another; }); } 编辑 最初的答案表明,我们只能对此类数组元素的结果进行sequence ,而不能对其执行进行sequence ,因为在此示例中它是预定义的。 但是,如何以避免提早执行的方式生成承诺数组呢? 这是一个修改后的示例: function sequence(nextPromise) { // while nextPromise() creates and returns another promise, // continue resolving it; } 我不想将它变成一个单独的问题,因为我认为这是同一问题的一部分。 解决方案
  • 这个新的ASP.NET安全漏洞有多严重?如何解决该漏洞?(How serious is this new ASP.NET security vulnerability and how can I workaround it?)
    问题 我刚刚在网上阅读了有关ASP.NET中新发现的安全漏洞的信息。 您可以在此处阅读详细信息。 问题在于ASP.NET实施AES加密算法以保护这些应用程序在用户会话期间生成的用于存储信息的cookie的完整性。 这有点含糊,但这是一个更令人恐惧的部分: 攻击的第一阶段需要数千个请求,但一旦成功,攻击者获得了秘密密钥,则完全是秘密的。所需的密码知识非常基础。 总而言之,我对安全性/加密图主题还不够熟悉,无法知道这是否真的那么严重。 那么,所有ASP.NET开发人员都应该担心这种可以在几秒钟之内拥有任何ASP.NET网站的技术吗? 此问题如何影响普通的ASP.NET开发人员? 它对我们有影响吗? 在现实生活中,此漏洞的后果是什么? 最后,是否有一些变通办法可以防止此漏洞? 感谢您的回答! 编辑:让我总结一下我得到的答复 因此,这基本上是一种“ padding oracle”攻击。 @Sri对此类攻击的含义提供了很好的解释。 这是有关此问题的令人震惊的视频! 关于此漏洞的严重性:是的,确实是严重的。 它使攻击者可以了解应用程序的机器密钥。 因此,他可以做一些非常不需要的事情。 拥有应用程序的机器密钥后,攻击者可以解密身份验证Cookie。 更糟糕的是,他可以使用任何用户的名称生成身份验证cookie 。 因此,他可以在网站上以任何人的身份出现。
  • 正则表达基础命令
      正则表达的基础知识已经在上一节讲过,下面要讲的是正则表达的三个关键命令grep、sed、awk。  1)grep 用于过滤行信息  作用:查找打印找与关键词匹配的行  参数:-n 在输出匹配行及行号一起输出;-v 打印不符合要求的行(取反);-i 不区分大小写;-w 打印完整单词的行;-An 打印符合要求的行以及下面n行;-Bn 打印符合要求的行以及上面n行;-Cn 打印符合要求的行以及上下n行。  [root@centos7 ~]# grep -A2 'halt' /etc/passwd     #把包含halt的行及其下面的两行输出  [root@centos7 ~]# grep -B2 'halt' /etc/passwd     #把包含halt的行及其上面的两行输出  [root@centos7 ~]# grep -C2 'halt' /etc/passwd     #把包含halt的行及其上下各两行输出  [root@centos7 ~]# grep -n 'root' /etc/passwd     #过滤出带有root关键字的行及行号  [root@centos7 ~]# grep -v 'nologin' /etc/passwd     #过滤不带有nologin的行  [root@centos7 ~]# grep '[0-9]' /etc/inittab
  • day07_控制语句入门
    在学习看着语句之前,我们先学习一下数据输入 /* 如何从键盘获取不同类型的变量:需要使用Scanner类 具体实现步骤: 1.导包:import java.util.Scanner; 2.Scanner的实例化:Scanner scan = new Scanner(System.in); 3.调用Scanner类的相关方法(next() / nextXxx()),来获取指定类型的变量 注意: 需要根据相应的方法,来输入指定类型的值。 如果输入的数据类型与要求的类型不匹配时,会报异常:InputMisMatchException 导致程序终止。 */ //1.导包:import java.util.Scanner; import java.util.Scanner; class ScannerTest{ public static void main(String[] args){ //2.Scanner的实例化 Scanner scan = new Scanner(System.in); //3.调用Scanner类的相关方法 System.out.println("请输入你的姓名:"); String name = scan.next(); System.out.println(name); System.out.println("请输入你的芳龄:"); int age =
  • Should functions return null or an empty object?(Should functions return null or an empty object?)
    问题 Locked. This question and its answers are locked because the question is off-topic but has historical significance. It is not currently accepting new answers or interactions. What is the best practice when returning data from functions. Is it better to return a Null or an empty object? And why should one do one over the other? Consider this: public UserEntity GetUserById(Guid userId) { //Imagine some code here to access database..... //Check if data was returned and return a null if none found if (!DataExists) return null; //Should I be doing this here instead? //return new UserEntity()
  • linux下使用find xargs grep查找文件及文件内容
    1,在某个路径下查文件。 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录。 find /etc -name “*” 3,在某个路径下查找所有包含“hello abcserver”字符串的文件。 find /etc -name “*” | xargs grep “hello abcserver” 或者find /etc -name “*” | xargs grep “hello abcserver” > ./cqtest.txt 4,网上摘抄的几个和查找文件或文件内容相关的命令详说: 正则表达式 \分别表示单词的开始和结束 ex: \ 以T或者t开头,om结尾的单词 正则表达式的元字符集: 1) ^行首 /^love/ 以love开头的行; 2) $行尾 /love$/ 以love结尾的行; 3) . /l..e/ 匹配所有这样的行,字母l后面紧跟任意两个字符然后是e的行 4) * 重复0次或者任意多次前面字符 5) [x-y] 字符范围 6) [^x-y] 排除字符范围 7) \ 转义字符 \ 界定单词的开头和结尾 9) \( \) 标记后面用到的匹配字符 \(love\)able \1er=loveable lover 10) x\{m,n\} 重复字符x至少m此,至多n次 ———————————
  • 如何用C ++中的new运算符初始化内存?(How to initialise memory with new operator in C++?)
    问题 我才刚刚开始使用C ++,我想养成一些良好的习惯。 如果我刚刚用new运算符分配了一个int类型的数组,那么如何将它们初始化为0而不自己遍历它们呢? 我应该只使用memset吗? 有没有一种“ C ++”的方式来做到这一点? 回答1 这是C ++的一个鲜为人知的鲜为人知的功能(事实证明,还没有人给出这个答案),但实际上它具有用于对数组进行值初始化的特殊语法: new int[10](); 请注意,必须使用空括号-例如,不能使用(0)或其他任何内容(这就是为什么这仅对值初始化有用)的原因。 ISO C ++ 03 5.3.4 [expr.new] / 15明确允许这样做,其中说: 创建一个T类型对象的new表达式按如下方式初始化该对象: ... 如果new-initializer的形式为() ,则该项目将被值初始化(8.5); 并且不限制允许使用的类型,而(expression-list)格式受同一节中其他规则的明确限制,因此它不允许数组类型。 回答2 分配固有类型数组的方法有很多,所有这些方法都是正确的,尽管选择哪种方法取决于... 手动初始化循环中的所有元素 int* p = new int[10]; for (int i = 0; i < 10; i++) p[i] = 0; 使用<cstring> std :: memset函数 int* p = new int[10]
  • Day04 内存划分、递归、数组初识
    内存划分 程序和进程 程序:可执行文件(指令集合),静态概念,一般保存在硬盘中 进程:正在执行的文件,动态概念 JVM内存划分 内存被划分为5个区域 : 程序计数器,方法区/静态区/静态代码段 , 栈内存(虚拟机栈) , 本地方法栈 , 堆内存 程序计数器 : 是一块较小的内存区域,作用可以看做是当前执行的行号,比如 if , 循环, 跳转,异常处理等 都需要依赖程序计数器来完成 静态区/方法区/静态代码段 : 是用来存放我们载入内存中的class文件,包括我们的方法,还有代码段都会保存在静态区 内部还有一个运行常量池 虚拟机栈 : 又叫栈内存 方法是在栈内存中执行的,包括局部变量也是在栈内存 栈内存 : 是一个以栈数据结构为模型,创建的一段空间 栈 : 是一种数据结构,先进后出,类似于子弹夹 栈空间 : 就是指以栈数据结构为模型开辟的空间 栈帧 : 就是栈内存中每一个栈元素 栈顶元素 : 指最后一个保存进去的元素 栈底元素 : 指最先保存进去的元素 栈操作 压栈 : 把元素添加到栈空间的过程 弹栈 : 在栈空间中把数据删除的过程 本地栈 : 和VM栈结构一致,只不过是用来执行本地方法,比如 hashCode(),我们自己写的方法都在VM栈执行 堆内存 : 用来保存对象 根据静态区的class文件,创建的用于存储成员属性的空间 每个对象空间 1 头部部分 : hashCode值 2