2009-08-04 25 views

Respuesta

11

Iterar sin embargo, encontrar el valor máximo (lo llaman MAXVAL), a continuación, recorrer una vez más y se multiplica cada valor de la lista por (100/MAXVAL).

var ratio = 100.0/list.Max(); 
var normalizedList = list.Select(i => i * ratio).ToList(); 
+0

¿y los números negativos? – Kobi

+0

ah, y el valor máximo puede ser 0, por lo que tiene 100/0. – Kobi

+1

Sí, probablemente debería verificarse el caso límite, aunque no existe una buena forma de "normalizar" una lista que es cero. – Amber

8

Si tiene una lista de números estrictamente positivos, entonces la respuesta de Dav le quedará bien.

Si la lista puede ser cualquier número en absoluto, entonces usted necesita para normalizar también a un límite inferior.

Suponiendo un límite superior de 100 y un límite inferior de 0, querrá algo como esto ...

var max = list.Max(); 
var min = list.Min(); 
var range = (double)(max - min); 
var normalised 
    = list.Select(i => 100 * (i - min)/range) 
     .ToList(); 

Manejo del caso en el que min == max se deja como ejercicio para el lector ...

+0

Hm ... Eso le dará una lista de los valles entre 0 y 1 ... – Guffa

+0

Tienes razón, lo arreglaré. – Bevan

6

para normalizar un conjunto de números que puede contener valores negativos,
y definir la gama de la escala normalizada:

List<int> list = new List<int>{-5,-4,-3,-2,-1,0,1,2,3,4,5}; 
double scaleMin = -1; //the normalized minimum desired 
double scaleMax = 1; //the normalized maximum desired 

double valueMax = list.Max(); 
double valueMin = list.Min(); 
double valueRange = valueMax - valueMin; 
double scaleRange = scaleMax - scaleMin; 

IEnumerable<double> normalized = 
    list.Select (i => 
     ((scaleRange * (i - valueMin)) 
      /valueRange) 
     + scaleMin); 
Cuestiones relacionadas