2013-05-20 2 views
-5

У меня есть эта структура данных:Может ли C# Linq делать комбинаторики?

class Product 
{ 
    public string Name { get; set; } 
    public int Count { get; set; } 
} 

var list = new List<Product>(){ { Name = "Book", Count = 40}, { Name = "Car", Count = 70}, { Name = "Pen", Count = 60}........... } // 500 product object 


var productsUpTo100SumCountPropert = list.Where(.....) ???? 

// productsUpTo100SumCountPropert output: 
// { { Name = "Book", Count = 40}, { Name = "Pen", Count = 60} } 

Я хочу суммировать свойства Count из коллекции и вернуть только продукты объекты, где это свойство Count сумма меньше или равна 100.

Если нет возможно ли с linq, что такое лучший подход, который я могу использовать?

+2

Да, это возможно. Я очень отговариваю вас от публикации вопросов «да/нет», иначе кто-то может ответить на них и дать вам ответ «да/нет». – Servy

+0

Что вы пробовали? Какое исследование вы сделали, чтобы использовать метод 'Where' (ваш пример показывает, что вы считаете, что это будет полезный оператор)? Там есть много учебников по этому вопросу. Вы читали? Вы что-то пробовали? Что случилось с вашими попытками? – Servy

+0

Ни один ответ не будет хорошим, если не будет лучшего понимания того, что вы хотите. Здесь есть 3 разных ответа, и я не знаю, является ли кто-то из них тем, что вы ищете. –

ответ

2

Судя по комментариям, которые вы оставили в ответах других людей, и your gist (link), похоже, что вы пытаетесь решить, на самом деле проблема Рюкзак - в частности, 0/1 Knapsack Problem (link).

Страница Википедии на эту тему (с которой я связан) имеет для вас короткое решение для динамического программирования. Он имеет псевдо-полиномиальное время работы («псевдо», поскольку сложность зависит от мощности вы выбираете для вашего рюкзака (W).

Хороший шаг предварительной обработки принять перед запуском алгоритма, чтобы найти наибольший общий знаменатель (GCD) всех ваших весов элементов (w_i), а затем разделить его из каждого значения.

d <- GCD({w_1, w_2, ..., w_N}) 
w_i' <- w_i/d //for each i = 1, 2, ..., N 
W' <- W/d //integer division here 

Затем решить проблему с помощью модифицированных весов и мощности вместо (w_i' и W').

жадный алгоритм Эй u использование в вашем gist не будет работать очень хорошо. Этот лучший алгоритм достаточно прост, чтобы его можно было реализовать.

+0

Очень хороший человек! Если кто-то хочет увидеть, что реализация может быть найдена по адресу http://rosettacode.org/wiki/Knapsack_problem/0-1#C.23 –

0
list.Where(p=> p.Count <= 100).ToList(); 
+0

Нет, это возвращает только те продукты, у которых Count Countt меньше или равно 100. мне нужны продукты группы, которая будет ее Свойс граф сумма <= 100 Посмотрите: вар продукты = {{Name = "Книга", Count = 40}, {Name = "Автомобиль", Count = 70}, { Name = "Computer", Count = 60}}; var p0 = products.Where (.......); p0; // {{Name = "Book", Count = 40}, {Name = "Computer", Count = 60}}; –

+0

@Alexsandro_xpt «Желаю ли LINQ или Lambda sum подсчитать размер и дать мне только объект продукта, где Count prop будет меньше или равно 100." Он дал вам то, что вы просили ... –

+0

@TimothyShields, посмотрите, что: https://gist.github.com/alexsandro-xpt/5620922 –

1

Вам нужно метод Count Extension

list.Count(p => p.Count <= 100); 

EDIT:

Если вы хотите, чтобы сумма элементов, Where и Sum методы расширения могут быть использованы:

list.Where(p => p.Count <= 100).Sum(p => p.Count); 
+0

Count и Sum retunr значение Int. Я не хочу судить или рассчитывать, я хочу, чтобы продукты, имеющие свой долг, подсчитывали сумму меньше или равную 100; –

+0

Так вы говорите, что хотите все в списке, пока весь список <= 100? Если нет, то как мы знаем, как «Группировать» элементы в списке вместе? Разделяем ли мы их, потому что все они имеют одно и то же имя? –

+0

Этот вопрос, у них не одно и то же имя. Я думаю, что это невозможно с LINQ, я ищу другой алгоритм. –

Смежные вопросы