2012-04-04 1 views
4

Представьте Doube списка, как следованиеЭто можно разделить все элементы C# двойного список для этой двойного списка элементов суммы (что составляет всего = 1)

List<double> lstDouble=new List<double>{4,6,2,7,1,1}; 

Так что я хочу делим все элементы этот список к сумме элементов (21).

Так что список будет после деления:

lstDouble = {4/21,6/21,2/21,7/21,1/21,1/21} 

Что будет означать, что новая сумма элементов = 1

Я могу сделать это с помощью итерации и т.д., но я задаюсь вопросом, есть ли короткий путь, так как У Матлаба есть. И мой помощник преподавателя продолжает рассказывать мне, что изучать Matlab и использовать его, но я не хочу: D Я люблю C#

Спасибо.

C# 4.0 WPF приложения

+0

Обратите внимание, что сумма будет примерно 1 после этого, и не совсем 1. В зависимости от значений приближение может быть очень плохо. – CodesInChaos

+0

Это не очень важно, но это будет близко 1. – MonsterMMORPG

+0

Вы хотите изменить входной массив или хотите вернуть новый, модифицированный массив? – CodesInChaos

ответ

1

Используйте лямбда-выражение:

lstDouble.ForEach(x => x = x/21); 
+1

'21' - это переменное число, которое зависит от размера и значений массива. – kasavbere

0

Это является псевдо-код:

double sum = 0; 
for(int i=0; i<array.length; i++) 
    sum+=array[i]; 
for(int i=0; i<array.length; i++) 
    array[i]=array[i]/sum; 
+0

Предполагаемый недостаток должен означать, что код не будет работать. Так почему отрицательный голос? – kasavbere

+0

даже это не гарантирует нисходящий голос. Плакат мог понять это оттуда. – kasavbere

+0

downvote означает, что ответ «не полезен». в этом вопросе говорится: «Я могу это сделать через итерацию», что и делает этот ответ, что делает этот ответ не полезным в контексте вопроса. –

4

Вы можете сделать это с помощью LINQ:

var sum = lstDouble.Sum(); 
var newLst = lstDouble.Select(x => x/sum); 
2
var sum = lstDouble.Sum(); 
var result = lstDouble.Select(v => v/sum); 
+0

Ваш код имеет квадратичное время выполнения ... – CodesInChaos

+0

@CodeInChaos Да, подумал об этом сразу после того, как я опубликовал. Исправленный. Теперь у меня такой же ответ, как и у всех остальных :-) – RobIII