public void InTransaction(Action action, DataPreprocessingChangedEventType type = DataPreprocessingChangedEventType.Any)
 {
     if (IsFiltered)
     {
         throw new InvalidOperationException("Transaction not possible while data is filtered");
     }
     originalData.InTransaction(action, type);
 }
        public void SetFilter(bool[] remainingRows)
        {
            filteredData = (IPreprocessingData)originalData.Clone();
            filteredData.InTransaction(() => {
                var remainingIndices = Enumerable.Range(0, remainingRows.Length).Where(x => remainingRows[x]);

                foreach (var v in filteredData.VariableNames)
                {
                    var ci = filteredData.GetColumnIndex(v);
                    if (filteredData.VariableHasType <double>(ci))
                    {
                        var values         = filteredData.GetValues <double>(ci);
                        var filteredValues = remainingIndices.Select(x => values[x]).ToList();
                        filteredData.SetValues(ci, filteredValues);
                    }
                    else if (filteredData.VariableHasType <DateTime>(ci))
                    {
                        var values         = filteredData.GetValues <DateTime>(ci);
                        var filteredValues = remainingIndices.Select(x => values[x]).ToList();
                        filteredData.SetValues(ci, filteredValues);
                    }
                    else if (filteredData.VariableHasType <string>(ci))
                    {
                        var values         = filteredData.GetValues <string>(ci);
                        var filteredValues = remainingIndices.Select(x => values[x]).ToList();
                        filteredData.SetValues(ci, filteredValues);
                    }
                }
            });
            OnFilterChanged();
        }