Extreme Optimization™: Complexity made simple.

Math and Statistics
Libraries for .NET

  • Home
  • Features
    • Math Library
    • Vector and Matrix Library
    • Statistics Library
    • Performance
    • Usability
  • Documentation
    • Introduction
    • Math Library User's Guide
    • Vector and Matrix Library User's Guide
    • Data Analysis Library User's Guide
    • Statistics Library User's Guide
    • Reference
  • Resources
    • Downloads
    • QuickStart Samples
    • Sample Applications
    • Frequently Asked Questions
    • Technical Support
  • Order
  • Company
    • About us
    • Testimonials
    • Customers
    • Press Releases
    • Careers
    • Partners
    • Contact us
Introduction
Deployment Guide
Nuget packages
Configuration
Using Parallelism
Expand Mathematics Library User's GuideMathematics Library User's Guide
Expand Vector and Matrix Library User's GuideVector and Matrix Library User's Guide
Expand Data Analysis Library User's GuideData Analysis Library User's Guide
Expand Statistics Library User's GuideStatistics Library User's Guide
Expand Data Access Library User's GuideData Access Library User's Guide
Expand ReferenceReference
  • Extreme Optimization
    • Features
    • Solutions
    • Documentation
    • QuickStart Samples
    • Sample Applications
    • Downloads
    • Technical Support
    • Download trial
    • How to buy
    • Blog
    • Company
    • Resources
  • Documentation
    • Introduction
    • Deployment Guide
    • Nuget packages
    • Configuration
    • Using Parallelism
    • Mathematics Library User's Guide
    • Vector and Matrix Library User's Guide
    • Data Analysis Library User's Guide
    • Statistics Library User's Guide
    • Data Access Library User's Guide
    • Reference
  • Reference
    • Extreme
    • Extreme.Collections
    • Extreme.Data
    • Extreme.Data.Json
    • Extreme.Data.Matlab
    • Extreme.Data.R
    • Extreme.Data.Stata
    • Extreme.Data.Text
    • Extreme.DataAnalysis
    • Extreme.DataAnalysis.Linq
    • Extreme.DataAnalysis.Models
    • Extreme.Mathematics
    • Extreme.Mathematics.Algorithms
    • Extreme.Mathematics.Calculus
    • Extreme.Mathematics.Calculus.OrdinaryDifferentialEquations
    • Extreme.Mathematics.Curves
    • Extreme.Mathematics.Curves.Nonlinear
    • Extreme.Mathematics.Distributed
    • Extreme.Mathematics.EquationSolvers
    • Extreme.Mathematics.Generic
    • Extreme.Mathematics.LinearAlgebra
    • Extreme.Mathematics.LinearAlgebra.Implementation
    • Extreme.Mathematics.LinearAlgebra.IterativeSolvers
    • Extreme.Mathematics.LinearAlgebra.IterativeSolvers.Preconditioners
    • Extreme.Mathematics.Optimization
    • Extreme.Mathematics.Optimization.LineSearches
    • Extreme.Mathematics.Random
    • Extreme.Mathematics.SignalProcessing
    • Extreme.Providers
    • Extreme.Providers.InteropServices
    • Extreme.Statistics
    • Extreme.Statistics.Distributions
    • Extreme.Statistics.Multivariate
    • Extreme.Statistics.Tests
    • Extreme.Statistics.TimeSeriesAnalysis
  • Extreme.DataAnalysis
    • Accumulator(T, U) Class
    • Aggregator(T, U) Class
    • Aggregator2(T, U) Class
    • Aggregator2Group Class
    • Aggregator2Group(T) Class
    • AggregatorGroup Class
    • AggregatorGroup(T) Class
    • Aggregators Class
    • BoundaryIntervalBehavior Enumeration
    • CategoricalEncoding Class
    • DataFrame Class
    • DataFrame(R, C) Class
    • DataFrameRow(R, C) Class
    • DateTimeExtensions Class
    • DateTimeUnit Enumeration
    • Direction Enumeration
    • Grouping Class
    • Grouping(TKey) Class
    • Histogram Class
    • Histogram(T) Class
    • IAccumulator(T, U) Interface
    • IAccumulator2(T, U) Interface
    • IAccumulator2(T, U, V) Interface
    • IAggregator Interface
    • IAggregator(T) Interface
    • IAggregator2 Interface
    • IAggregator2(T) Interface
    • IDataFrame Interface
    • IGrouping Interface
    • IIndex Interface
    • Index Class
    • Index(T) Class
    • IntervalIndex(T) Class
    • IPivot Interface
    • JoinIndex Class
    • JoinType Enumeration
    • MissingValueAction Enumeration
    • MissingValueException Class
    • MultipleMissingValueAction Enumeration
    • Parameter(T) Class
    • ParameterVector(T) Class
    • Pivot Class
    • Pivot(R, C) Class
    • RankTiebreaker Enumeration
    • Recurrence Class
    • SortOrder Enumeration
    • SpecialBins Enumeration
    • Subset Class
    • TransformedParameter(T) Class
    • TypePreservingAggregatorGroup Class
    • VectorExtensions Class
  • DataFrame(R, C) Class
    • DataFrame(R, C) Constructor
    • Properties
    • Methods
    • Operators

DataFrameR, C Class

Extreme Optimization Numerical Libraries for .NET Professional
Represents a data frame with row and column indexes of the specified type.
Inheritance Hierarchy

SystemObject
  Extreme.DataAnalysisDataFrameR, C

Namespace:  Extreme.DataAnalysis
Assembly:  Extreme.Numerics (in Extreme.Numerics.dll) Version: 8.1.1
Syntax

C#
VB
C++
F#
Copy
public class DataFrame<R, C> : IDataFrame, 
	ISummarizable, IList<DataFrameRow<R, C>>, ICollection<DataFrameRow<R, C>>, 
	IEnumerable<DataFrameRow<R, C>>, IEnumerable
Public Class DataFrame(Of R, C)
	Implements IDataFrame, ISummarizable, IList(Of DataFrameRow(Of R, C)), 
	ICollection(Of DataFrameRow(Of R, C)), IEnumerable(Of DataFrameRow(Of R, C)), 
	IEnumerable
generic<typename R, typename C>
public ref class DataFrame : IDataFrame, 
	ISummarizable, IList<DataFrameRow<R, C>^>, ICollection<DataFrameRow<R, C>^>, 
	IEnumerable<DataFrameRow<R, C>^>, IEnumerable
type DataFrame<'R, 'C> =  
    class
        interface IDataFrame
        interface ISummarizable
        interface IList<DataFrameRow<'R, 'C>>
        interface ICollection<DataFrameRow<'R, 'C>>
        interface IEnumerable<DataFrameRow<'R, 'C>>
        interface IEnumerable
    end

Type Parameters

R
The element type of the row index.
C
The element type of the column index.

The DataFrameR, C type exposes the following members.

Constructors

  NameDescription
Public methodDataFrameR, C
Constructs a new empty data frame.
Top
Properties

  NameDescription
Public propertyColumnCount
Gets the number of columns in the data frame.
Public propertyColumnIndex
Gets or sets the column index of the data frame.
Public propertyColumns
Gets an enumerator over the columns of the data frame.
Public propertyItemC
Gets, sets or adds a column with the specified key.
Public propertyItemInt32
Gets the column at the specified index.
Public propertyNamedColumns
Gets an enumerator over pairs of column key values and the corresponding columns.
Public propertyNamedRows
Gets an enumerator over pairs of row key values and the corresponding rows.
Public propertyRowCount
Gets the number of rows in the data frame.
Public propertyRowIndex
Gets the row index of the data frame.
Public propertyRows
Gets an enumerator over the rows of the data frame.
Top
Methods

  NameDescription
Public methodAddColumn(C, IVector)
Adds a column to the data frame.
Public methodAddColumnT(C, VectorT)
Adds a column to the data frame.
Public methodAddColumnT(C, IListT)
Adds a column to the data frame.
Public methodAggregateT(AggregatorGroupT)
Applies the specified aggregator to all the columns in the data frame.
Public methodAggregateT(AggregatorGroupT)
Applies the specified aggregators to all the columns in the data frame.
Public methodAggregateT, U(FuncVectorT, U)
Applies the specified aggregators to all the columns in the data frame.
Public methodAggregateT, U, V(FuncVectorT, V, FuncVectorU, V)
Applies the specified aggregators to all the columns in the data frame.
Public methodAggregateT, U, V, W(FuncVectorT, W, FuncVectorU, W, FuncVectorV, W)
Applies the specified aggregators to all the columns in the data frame.
Public methodAggregateByR1(C, AggregatorGroup)
Returns a new data frame that aggregates the columns grouped by the specified column.
Public methodAggregateByR1(C, ValueTupleC, AggregatorGroup)
Returns a new data frame that aggregates the columns grouped by the specified column.
Public methodAggregateByR1(GroupingR1, AggregatorGroup)
Returns a new data frame that aggregates the columns according to the specified grouping.
Public methodAggregateByR1(GroupingR1, IDictionaryC, AggregatorGroup)
Applies the aggregators from a dictionary to selected columns in the data frame.
Public methodAggregateByR1(GroupingR1, ValueTupleC, AggregatorGroup)
Returns a new data frame that aggregates the columns according to the specified grouping.
Public methodAggregateByR1(IGrouping, AggregatorGroup)
Returns a new data frame that aggregates the columns according to the specified grouping.
Public methodAggregateByR1(IGrouping, ValueTupleC, AggregatorGroup)
Returns a new data frame that aggregates the columns according to the specified grouping.
Public methodAggregateByR1(IListR1, AggregatorGroup)
Returns a new data frame that aggregates the columns grouped by the specified vector.
Public methodAggregateByR1(IListR1, ValueTupleC, AggregatorGroup)
Returns a new data frame that aggregates the columns grouped by the specified vector.
Public methodAggregateByR1, T(C, AggregatorGroupT)
Returns a new data frame that aggregates the columns grouped by the specified column.
Public methodAggregateByR1, T(GroupingR1, AggregatorGroupT)
Returns a new data frame that aggregates the columns according to the specified grouping.
Public methodAggregateByR1, T(IGrouping, AggregatorGroupT)
Returns a new data frame that aggregates the columns according to the specified grouping.
Public methodAggregateByR1, T(IListR1, AggregatorGroupT)
Returns a new data frame that aggregates the columns grouped by the specified vector.
Public methodAggregateByR1, C1(GroupingR1, IEnumerableValueTupleC, AggregatorGroup, IndexC1)
Applies the specified aggregators to all the columns in the data frame.
Public methodAggregateByR1, T, U(C, FuncVectorT, U)
Applies the specified aggregation function to the values in each column grouped by the specified grouping column.
Public methodAppend(DataFrameR, C, IndexC, Boolean)
Combines two data frames by appending the rows of the right data frame to the rows of this data frame.
Public methodAppend(DataFrameR, C, JoinType, Boolean)
Combines two data frames by appending the rows of the right data frame to the rows of this data frame.
Public methodApplyWithT
Applies a matrix function to this data frame and another and returns the result as a data frame.
Public methodClone
Makes a copy of the data frame.
Public methodCombineWithT
Combines the data frame with another data frame, aligning the two data frames and using the specified function to generate the value for common values.
Public methodDescribe
Returns a data frame containing descriptive statistics for each column in the data frame.
Public methodEquals
Determines whether the specified object is equal to the current object.
(Inherited from Object.)
Protected methodFinalize
Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
(Inherited from Object.)
Public methodGetColumn(C)
Gets the specified column as a Double vector.
Public methodGetColumnT(C)
Gets the specified column as a strongly typed vector.
Public methodGetColumns(C)
Returns a new data frame that contains only the specified columns.
Public methodGetColumns(IEnumerableC)
Returns a new data frame that contains only the specified columns.
Public methodGetColumnsAt(IEnumerableInt32)
Returns a new data frame that contains only the specified columns.
Public methodGetColumnsAt(Int32)
Returns a new data frame that contains only the specified columns.
Public methodGetEnumerator
Gets an enumerator for the rows of the data frame.
Public methodGetHashCode
Serves as the default hash function.
(Inherited from Object.)
Public methodGetNearestRow
Gets the row nearest to the specified row key.
Public methodGetNearestRowAsT
Gets the row at the specified row index as a vector of the specified type.
Public methodGetNearestRows
Returns a new data frame that contains only the rows in the specified sequence.
Public methodGetRow
Gets the row with the specified row key.
Public methodGetRowAsT
Gets the row at the specified row index as a vector of the specified type.
Public methodGetRowAt
Gets the row with the specified row key.
Public methodGetRowAtAsT
Gets the row at the specified row index.
Public methodGetRows(R)
Returns a new data frame that contains only the rows with keys in the specified array.
Public methodGetRows(IEnumerableR)
Returns a new data frame that contains only the rows in the specified sequence.
Public methodGetRows(Subset)
Returns a new data frame that contains only the rows in the specified subset.
Public methodGetRows(VectorBoolean)
Returns a new data frame that contains only the rows specified by a boolean mask.
Public methodGetRows(R, R)
Returns a new data frame that contains only the rows specified by a range.
Public methodGetRowsAt
Returns a new data frame that contains only the rows in the specified sequence.
Public methodGetType
Gets the Type of the current instance.
(Inherited from Object.)
Public methodGroupByR1(C)
Returns a hierarchical index consisting of the current index grouped by the specified column.
Public methodGroupByR1(IListR1)
Returns a hierarchical grouping consisting of the current index grouped by the specified grouping values.
Public methodGroupByR1, R2(C, C)
Returns a hierarchical grouping on two columns.
Public methodGroupedByR1
Returns a new data frame by grouping the index by the specified column.
Public methodHead
Returns the first few rows of the data frame.
Public methodMakeCategorical(C)
Marks the specified column as containing categorical data.
Public methodMakeCategorical(C)
Marks the specified columns as containing categorical data.
Public methodMakeCategoricalT(C, IndexT)
Marks the specified column as containing categorical data.
Public methodMakeCategoricalAt(Int32)
Marks the column at the specified index as containing categorical data.
Public methodMakeCategoricalAtT(Int32, IndexT)
Marks the column at the specified index as containing categorical data.
Public methodMap(IListC, FuncIVector, IVector, IListC)
Applies the specified function to selected columns and returns the result in a new data frame.
Public methodMap(IListC, FuncIVector, IVector, FuncC, C)
Applies the specified function to selected columns and returns the result in a new data frame.
Public methodMapT(FuncVectorT, IVector)
Applies the specified function to all columns with the specified element type and returns the result in a new data frame.
Public methodMapT(IListC, FuncVectorT, IVector, IListC)
Applies the specified function to selected columns.
Public methodMapT(IListC, FuncVectorT, IVector, FuncC, C)
Applies the specified function to selected columns.
Public methodMapAndAppend(C, FuncIVector, IVector, C)
Applies the specified function to selected columns and appends the results to the end of the data frame.
Public methodMapAndAppend(IListC, FuncIVector, IVector, IListC)
Applies the specified function to selected columns and appends the results to the end of the data frame.
Public methodMapAndAppend(IListC, FuncIVector, IVector, FuncC, C)
Applies the specified function to selected columns.
Public methodMapAndAppendT(C, FuncVectorT, IVector, C)
Applies the specified function to selected columns and appends the results to the end of the data frame.
Public methodMapAndAppendT(IListC, FuncVectorT, IVector, IListC)
Applies the specified function to selected columns and appends the results to the end of the data frame.
Public methodMapAndAppendT(IListC, FuncVectorT, IVector, FuncC, C)
Applies the specified function to selected columns.
Public methodMapAndInsertAfter(C, FuncIVector, IVector, C)
Applies the specified function to selected columns.
Public methodMapAndInsertAfter(IListC, FuncIVector, IVector, IListC)
Applies the specified function to selected columns and inserts the result after each mapped column in the data frame.
Public methodMapAndInsertAfter(IListC, FuncIVector, IVector, FuncC, C)
Applies the specified function to selected columns.
Public methodMapAndInsertAfterT(C, FuncVectorT, IVector, C)
Applies the specified function to selected columns.
Public methodMapAndInsertAfterT(IListC, FuncVectorT, IVector, IListC)
Applies the specified function to selected columns and inserts the result after each mapped column in the data frame.
Public methodMapAndInsertAfterT(IListC, FuncVectorT, IVector, FuncC, C)
Applies the specified function to selected columns.
Public methodMapAndReplace(C, FuncIVector, IVector, C)
Applies the specified function to selected columns.
Public methodMapAndReplace(IListC, FuncIVector, IVector, IListC)
Applies the specified function to selected columns and replaces the columns with the mapped columns.
Public methodMapAndReplace(IListC, FuncIVector, IVector, FuncC, C)
Applies the specified function to selected columns.
Public methodMapAndReplaceT(C, FuncVectorT, IVector, C)
Applies the specified function to selected columns.
Public methodMapAndReplaceT(IListC, FuncVectorT, IVector, IListC)
Applies the specified function to selected columns and replaces the columns with the mapped columns.
Public methodMapAndReplaceT(IListC, FuncVectorT, IVector, FuncC, C)
Applies the specified function to selected columns.
Protected methodMemberwiseClone
Creates a shallow copy of the current Object.
(Inherited from Object.)
Public methodPivotR1, C1, T(C, C, C)
Constructs a new data frame using the specified columns as row and column indexes.
Public methodPivotR1, C1, T(C, C, C, AggregatorGroupT)
Constructs a new data frame using the specified columns as row and column indexes and aggregates the values corresponding to each row-column pair.
Public methodPivotByR1, C1
Returns a two-dimensional grouping on the specified columns.
Public methodRemoveColumn
Removes the specified column from the data frame.
Public methodRemoveColumnAt
Removes the column at the specified position from the data frame.
Public methodRemoveColumnsAt
Removes the column at the specified position from the data frame.
Public methodRemoveColumnsWithMissingValues
Returns a new data frame with any columns containing missing values removed.
Public methodRemoveRowIndex
Returns a new data frame that has a default numeric row index. The row index is discarded.
Public methodRemoveRowIndex(C)
Returns a new data frame that has a default numeric row index. The row index is moved to a new column in the data frame.
Public methodRemoveRows(IEnumerableR)
Returns a new data frame that has the specified rows removed.
Public methodRemoveRows(VectorBoolean)
Returns a new data frame that has the specified rows removed.
Public methodRemoveRowsAt
Returns a new data frame that has the specified rows removed.
Public methodRemoveRowsWithMissingValues
Returns a new data frame with any rows containing missing values removed.
Public methodRemoveRowsWithMissingValues(C)
Returns a new data frame with any rows containing missing values removed.
Public methodRenameColumn(C, C)
Renames the specified column.
Public methodRenameColumn(IEnumerableC, IEnumerableC)
Renames the specified column.
Public methodRenameColumns
Renames the columns that satisfy a condition using the specified key generator.
Public methodReplaceMissingValues(Direction, Int32)
Returns a new data frame whose columns have their missing values replaced with the next or previous non-missing value.
Public methodReplaceMissingValuesT(T)
Returns a new data frame whose columns of the specified type have their missing values replaced with the specified value.
Public methodReplaceMissingValuesT(VectorT)
Returns a new data frame whose columns of the specified type have their missing values replaced with the corresponding value from a row vector.
Protected methodSelectRowsR1(IndexR1, Subset)
Returns a new data frame that contains the selected rows and uses the specified row index.
Protected methodSelectRowsR1(IndexR1, Int32)
Returns a new data frame that contains the selected rows and uses the specified row index.
Protected methodSelectRowsR1(IndexR1, Int32, Int32, Int32)
Returns a new data frame that contains the selected rows and uses the specified row index.
Public methodSortBy(C)
Sorts the data frame by the specified column.
Public methodSortBy(Int32)
Sorts the data frame by the specified column.
Public methodSortBy(C, SortOrder)
Sorts the data frame by the specified column.
Public methodSortBy(Int32, SortOrder)
Sorts the data frame by the specified column.
Public methodSortByIndex
Sorts the data frame by the row index in ascending order.
Public methodSortByIndex(SortOrder)
Sorts the data frame by the row index.
Public methodStack
Returns a data frame containing all values in the data frame as row-column-value pairs.
Public methodStackT(IEnumerableC, IEnumerableC, C, C)
Converts a data frame from wide to long format.
Public methodSummarize
Returns a summary of the contents of the data frame using the default summary options.
Public methodSummarize(SummaryOptions)
Returns a summary of the contents of the data frame using the specified options.
Public methodTail
Returns the last few rows of the data frame.
Public methodToMatrixT
Converts the data frame to a matrix with elements of the specified type.
Public methodToString
Returns a string that represents the current object.
(Overrides ObjectToString.)
Public methodTransformColumns(FuncIVector, IVector)
Applies the specified transformation to each column in the data frame.
Public methodTransformColumnsT, U(FuncT, U)
Applies the specified transformation to each element of each column in the data frame.
Public methodTransformColumnsT, U(FuncVectorT, VectorU)
Applies the specified transformation to each column in the data frame.
Public methodTransformColumnsT, U, R1(FuncVectorT, VectorU)
Applies the specified transformation to each column in the data frame.
Public methodTryGetRow
Attempts to get the row at the specified row index.
Public methodUnstackT
Converts a data frame from long to wide format.
Public methodWithColumnIndexC1
Returns a new data frame that relabels the columns using the specified index.
Public methodWithRowIndexR1(C)
Returns a new data frame using the specified column as the index.
Public methodWithRowIndexR1(IndexR1)
Returns a new data frame that uses the specified row index.
Public methodWithRowIndexR1, R2(C, C)
Returns a new data frame using the specified columns as a hierarchical index.
Public methodWithRowIndexR1, R2, R3(C, C, C)
Returns a new data frame using the specified columns as a hierarchical index.
Top
Operators

  NameDescription
Public operatorStatic memberDynamic
Gets the specified column as a vector of Double.
Public operatorStatic memberDynamicAssignment
Sets the specified column.
Top
Extension Methods

  NameDescription
Public Extension MethodGroupDataFrameRowR, COverloaded.
Returns a grouping by the unique elements in a list.
(Defined by Grouping.)
Public Extension MethodGroupDataFrameRowR, COverloaded.
Returns a grouping by the unique elements in a sequence.
(Defined by Grouping.)
Public Extension MethodGroupDataFrameRowR, C(IEqualityComparerDataFrameRowR, C)Overloaded.
Returns a grouping by the unique elements in a list using the specified comparer to determine equality.
(Defined by Grouping.)
Public Extension MethodGroupDataFrameRowR, C(IEqualityComparerDataFrameRowR, C)Overloaded.
Returns a grouping by the unique elements in a sequence using the specified comparer to determine equality.
(Defined by Grouping.)
Public Extension MethodSumDataFrameRowR, COverloaded.
Computes the sum of the sequence of values.
(Defined by ArrayMath.)
Public Extension MethodSumDataFrameRowR, C, U(FuncDataFrameRowR, C, U)Overloaded.
Computes the sum of the sequence of values that are obtained by invoking a transform function on each element of the input sequence.
(Defined by ArrayMath.)
Public Extension MethodToDataTableOverloaded.
Constructs a data table from a data frame.
(Defined by DataExtensions.)
Public Extension MethodToDataTable(String)Overloaded.
Constructs a data table from a data frame.
(Defined by DataExtensions.)
Public Extension MethodToDataTableC(IEnumerableC)Overloaded.
Constructs a data table from the specified columns a data frame.
(Defined by DataExtensions.)
Public Extension MethodToDataTableC(String, IEnumerableC)Overloaded.
Constructs a data table from the specified columns a data frame.
(Defined by DataExtensions.)
Top
Remarks

Use the DataFrameR, C type to represent a 2-dimensional collection of possibly heterogeneous data. The rows and columns are indexed by keys of type R and C, respectively. Rows and columns can be accessed through their keys or ordinal position.

Any operation that changes the rows of a data frame always returns a new data frame. Columns can be added and removed from a data frame without creating a new data frame. The values in a column are immutable, so direct modification of data values is not supported.

The columns of a data frame are stored as strongly typed vectors. However, the column types are not part of the type definition of the data frame. This means that the element type of the column must be specified when accessing a column, or an untyped vector is returned as an IVector object. Some care must be taken to specify the correct element type, or an exception may be thrown at runtime.

The fact that the data is stored in columns means that accessing the data is most efficient column-wise. When computing values based on multiple columns, it is better to write the operation in terms of the column vectors than to iterate through the rows of the data frame.

The data frame class supports many data manipulation and transformation operations, including adding and removing columns, selecting rows, structural operations like stacking and creating pivot tables, processing missing values and aggregation. By including the Extreme.DataAnalysis.Linq namespace, LINQ queries are also supported.

Hierarchical row and column indexes are supported. In order to return the proper type of the indexes, some structural operations are defined as extension methods in the static DataFrame class.

See Also

Reference

Extreme.DataAnalysis Namespace

Copyright (c) 2004-2021 ExoAnalytics Inc.

Send comments on this topic to support@extremeoptimization.com

Copyright © 2004-2021, Extreme Optimization. All rights reserved.
Extreme Optimization, Complexity made simple, M#, and M Sharp are trademarks of ExoAnalytics Inc.
Microsoft, Visual C#, Visual Basic, Visual Studio, Visual Studio.NET, and the Optimized for Visual Studio logo
are registered trademarks of Microsoft Corporation.