private void AddTypeSelectedForSimilarityTableEntry(StringValue[] typeSelectedForSimilarity) {
      if (!ResultCollection.ContainsKey(TypeSelectedForSimilarityParameterName)) {
        var newTable = new DataTable(TypeSelectedForSimilarityParameterName, "");
        newTable.VisualProperties.YAxisTitle = "Percentage";
        newTable.VisualProperties.YAxisMaximumAuto = false;

        ResultCollection.Add(new Result(TypeSelectedForSimilarityParameterName, newTable));
      }
      var table = ((DataTable)ResultCollection[TypeSelectedForSimilarityParameterName].Value);

      // all rows must have the same number of values so we can just take the first
      int numberOfValues = table.Rows.Select(r => r.Values.Count).DefaultIfEmpty().First();

      double count = typeSelectedForSimilarity.Count();
      var groupedValues = typeSelectedForSimilarity.Select(x => x.Value).GroupBy(x => x);
      foreach (var type in groupedValues) {
        if (!table.Rows.ContainsKey(type.Key)) {
          // initialize a new row for the symbol and pad with zeros
          DataRow row = new DataRow(type.Key, "", Enumerable.Repeat(0.0, numberOfValues));
          row.VisualProperties.StartIndexZero = true;
          table.Rows.Add(row);
        }
        table.Rows[type.Key].Values.Add(type.Count() / count * 100);
      }

      // add a zero for each data row that was not modified in the previous loop 
      foreach (var row in table.Rows.Where(r => r.Values.Count != numberOfValues + 1))
        row.Values.Add(0.0);
    }