Re: Вывод типа результата по выражению
От: Аноним  
Дата: 09.07.09 11:52
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Хочется добавить поддержку формул в наше spreadsheet-based приложение, как бы это поэлегантнее и с наименьшими усилиями сделать? Известны имена колонок и их типы, например:


A>owner — string

A>row — int64
A>col — int64
A>volume — double

Не вполне понял задачу. Если типы колонок заранее известны — это больше похоже на таблицу в базе данных, а не на электронную таблицу. Spreadsheet, как правило, подразумевает, что тип значения, хранящегося в ячейке, будет меняться. И тогда само собой напрашивается решение — использовать в качестве возвращаемого типа object.

Далее. Не понятно, к какому именно значению идет обращение по имени, если имя присвоено всему столбцу? Вероятно, подразумевается существование понятия "текущая строка"? Как вы тогда обращаетесь к данным, находящимся не в текущей строке?

Мне кажется, что (в предположении, что я правильно понял задачу) лучшим решением будет следующее:

Предлагаю вместо
public static Func<string, Int64, Int64, double, double> calc = (owner, row, col, volume) => volume * row;


генерировать
public static Func<SpreadSheetRowObjectType, object> calc = (spreadSheetRow) => spreadSheetRow.volume * spreadSheetRow.row;


а пользователи в ячейках таблицы будут, соответственно, писать
spreadSheetRow.volume * spreadSheetRow.conc 
spreadSheetRow.owner != null && spreadSheetRow.row > 5 && spreadSheetRow.col < 3 
spreadSheetRow.owner != null && spreadSheetRow.row > 5 && spreadSheetRow.col < 3 ? "foo" : "bar"

{
   if (spreadSheetRow.volume == null) return 4;
   return 3;
}


Объект SpreadSheetRowObjectType должен иметь по свойству на каждую колонку, его тоже можно генерировать на лету для каждого листа.

Такое решение обладает рядом преимуществ:

1. Явно отличаются "переменные листа" от всех других имен (переменных, констант и пр.). Такой синтаксис — более прозрачен.
2. Гибкость. Наверное, со временем вы захотите использовать переменные с других листов, или из другой строки того же листа — у вас уже будет готовая синтаксическая конструкция (в дополнение к предопределенному объекту spreadSheetRow вы введете nextRow, sheets[] и т.п.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.