我正在尝试将一些Excel公式转换为C#代码,我有点迷失......
我有以下内容:
SUMPRODUCT(1*(RIGHT(A1)={"a","e","i","n","y"}))
究竟是什么意思?
以下是我所知道的:
RIGHT(A1)
返回A1
中文字的最后一个字符。SUMPRODUCT({1,2,3}, {4,5,6})
返回1*4 + 2*5 + 3*6
(类似于标量产品,对吗?)但这是我不明白的地方:
如果文字为Claude
,例如......
RIGHT(A1)={"e","a","b","c","d"}
返回TRUE
和
RIGHT(A1)={"a","b","e","c","d"}
返回FALSE
我只更改了e
字符的索引位置。
那里发生了什么? 我不明白的是什么?
答案 0 :(得分:8)
基本上,公式是检查单元格A1
中的最后一个字符是否是以下任何字符:a,e,i,n或y。 SUMPRODUCT
部分非常重要,因为一次检查整个数组与最后一个字符是一致的。当您剥离该部分并仅使用RIGHT(A1)={"a","b","e","c","d"}
时,Excel实际上只查看数组中的第一个条目,检查它是否匹配,并立即返回。因此,当'e'处于第一位置时,您就会变为真。
SUMPRODUCT
允许在整个数组中应用检查。另一种看待这种情况的方法是手动将其以网格方式输入到单独的单元格中,如此
A | B | C | D
1 | Claude | =RIGHT(A1,1) | 'a' | =1*(B1=C1)
2 | | =RIGHT(A1,1) | 'e' | =1*(B2=C2)
3 | | =RIGHT(A1,1) | 'i' | =1*(B3=C3)
4 | | =RIGHT(A1,1) | 'n' | =1*(B4=C4)
5 | | =RIGHT(A1,1) | 'y' | =1*(B5=C5)
6 | | | | =SUM(D1:D5)
如果任何字符a,e,i,n,y位于A1的值的末尾,则右下角的单元格将包含1,否则为0。我手动执行与SUMPRODUCT
相同的逻辑以获得相同的结果。
那么,如何在C#.Net中实现这一目标:
var checkValue = "Claude";
var letters = {"a", "e", "i", "n", "y"};
var found = 0;
foreach (var theLetter in letters)
if (checkValue.EndsWith(theLetter))
found = 1;
return found; // returns same value as Excel function
答案 1 :(得分:1)
如果你想要一条基于@ CoryLarson建议的行可以用于任何一组字母:
Func<string, string[], int> LetterCount = (x, y) => y.Contains(x.Substring(x.Length-1, 1)) ? 1 : 0;