Преобразование некоторых формул Excel в C # - PullRequest
3 голосов
/ 24 сентября 2011

Я пытаюсь преобразовать некоторые формулы 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.

Что там происходит?
Чего я не понимаю?

Ответы [ 2 ]

8 голосов
/ 24 сентября 2011

В основном формула проверяет, является ли последний символ в ячейке A1 одним из следующих символов: a, e, i, n или y. Часть SUMPRODUCT важна, потому что это взломать проверку всего массива сразу по последнему символу. Когда вы удаляете эту часть и просто используете RIGHT(A1)={"a","b","e","c","d"}, Excel фактически просматривает только первую запись в массиве, проверяет, соответствует ли она, и сразу же возвращает результат. Поэтому, когда «е» находится на первой позиции, вы получаете Истину.

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)

Нижняя правая ячейка будет содержать 1, если любой из символов a, e, i, n, y находится в конце значения в A1, или 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 голос
/ 24 сентября 2011

Если вам нужна одна строка на основе предложения @ CoryLarson, которая будет работать для любого набора букв:

Func<string, string[], int> LetterCount = (x, y) => y.Contains(x.Substring(x.Length-1, 1)) ? 1 : 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...