void PreprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e)
        {
            switch (e.Type)
            {
            case DataPreprocessingChangedEventType.DeleteColumn:
            case DataPreprocessingChangedEventType.ChangeColumn:
                MissingValueIndicies.Remove(e.Column);
                ValuesWithoutNaN.Remove(e.Column);
                break;

            case DataPreprocessingChangedEventType.AddColumn:
                //cache does not need to be updated, will be calculated the first time it is requested
                break;

            case DataPreprocessingChangedEventType.DeleteRow:
            case DataPreprocessingChangedEventType.AddRow:
            case DataPreprocessingChangedEventType.ChangeItem:
            case DataPreprocessingChangedEventType.Any:
            case DataPreprocessingChangedEventType.Transformation:
            default:
                MissingValueIndicies = new Dictionary <int, IList <int> >();
                ValuesWithoutNaN     = new Dictionary <int, IList>();
                break;
            }
        }
        public IEnumerable <T> GetValuesWithoutNaN <T>(int columnIndex, bool considerSelection)
        {
            if (considerSelection)
            {
                var selectedRows = preprocessingData.Selection[columnIndex];

                List <T> values = new List <T>();
                foreach (var rowIdx in selectedRows)
                {
                    if (!IsMissingValue(columnIndex, rowIdx))
                    {
                        values.Add(preprocessingData.GetCell <T>(columnIndex, rowIdx));
                    }
                }
                return(values);
            }
            else
            {
                if (!ValuesWithoutNaN.ContainsKey(columnIndex))
                {
                    List <T> values = new List <T>();

                    for (int row = 0; row < preprocessingData.Rows; ++row)
                    {
                        if (!IsMissingValue(columnIndex, row))
                        {
                            values.Add(preprocessingData.GetCell <T>(columnIndex, row));
                        }
                    }

                    ValuesWithoutNaN[columnIndex] = values;
                }
                return((IEnumerable <T>)ValuesWithoutNaN[columnIndex]);
            }
        }
 void FilterLogic_FilterChanged(object sender, EventArgs e)
 {
     //recalculate
     for (int i = 0; i < Columns; i++)
     {
         MissingValueIndicies.Remove(i);
         ValuesWithoutNaN.Remove(i);
     }
 }