2015-05-13 5 views
-1

Возможно, кто-то знает, как достичь такого рода запросов в linq (или лямбда).Проблема с Linq в группе по запросу

У меня есть этот набор в списке

example of data

Фильтр: Мой вход будет кодом 100 и 101, мне нужно, чтобы получить "ценность", в этом примере = 1, 2.

Проблема: Если вы вводите 100 и 101, вы получите 3 результата из-за 100 из группы 1 и группы 2. Мне просто нужна пара, которая совпадает в той же группе. (И у вас нет группы в качестве входного параметра)

Как я могу решить эту проблему, если группа полностью существует?

спасибо!

+0

Как ваши данные "100 и 101" точно? Какова структура данных здесь? Это поможет, если вы предоставите короткий, но полный пример кода. Кроме того, каковы были бы значения, если бы была также * строка «code = 101, value = 5, group = 2»? А если бы была строка «code 102, value = 6, group = 1»? Непонятно, чего вы пытаетесь достичь. –

+0

Ввод является перечислимым с значениями bouth, остальное не важно для вопроса, потому что вы можете иметь тысячи переменных, мне просто нужно добиться этого результата. Если в будущем появятся другие данные, я обработаю его. Благодаря.! – Yogurtu

+0

Я прав, думая, что с таблицей у вас здесь единственные входы, которые вы когда-либо имели, были бы '100' и' 101' или '100' &' 103'? То есть, у вас никогда не будет входа, который не был бы полной группой? Кроме того, вы могли бы создать группу, которая идеально соответствовала бы другой группе? (например, могут существовать строки с '100: 5: 3' и' 101: 6: 3', что означает, что группа 3 также соответствует)? –

ответ

1

Начиная с простого представления в коде того, что у вас есть в картине:

var list = new[] 
{ 
    new{code = 100, value = 1, group = 1}, 
    new{code = 101, value = 2, group = 1}, 
    new{code = 100, value = 3, group = 2}, 
    new{code = 103, value = 4, group = 2}, 
}; 
var inp = new[]{100, 103}; 

Тогда мы можем сделать:

list 
    .GroupBy(el => el.group) // Group by the "group" field. 
    .Where(grp => !inp.Except(grp.Select(el => el.code)).Any()) // Exclude groups that don't contain all input values 
    .Single() // Obtain the only such group (with a check that there is only one) 
    .Select(el => el.value); // Obtain the "value" fields. 

Если бы вы, возможно, есть материалы, которые были подмножеством «коды» некоторых групп, вы также можете проверить, что вы полностью сопоставляете всю группу, исключая группы, которые имеют разный размер:

list 
    .GroupBy(el => el.group) 
    .Where(grp => 
    grp.Count‎() == inp.Count() 
    && !inp.Except(grp.Select(el => el.code)).Any()) 
    .Single() 
    .Select(el => el.value); 

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

+0

Прохладный !, ответ под «тогда мы можем сделать» работал сладким! спасибо !, также работал с нелинковым методом, который не знал, называется «SequenceEqual». Может быть, вы могли бы группировать значения и возвращать только группу, которая SequenceEqual = true? – Yogurtu

+0

Linq-метод 'SequenceEqual' будет считать две последовательности равными, если они имеют соответствующие элементы в том же порядке. 'sequenceA.Count() == sequenceB.Count() &&! sequenceA.Except (sequenceB) .Any()' будет соответствовать двум последовательностям, игнорирующим порядок. Используйте то, что более подходит. Учитывая последовательности, которые, как известно, находятся в одном порядке, это, конечно, одно и то же, но «SequenceEqual» будет быстрее в этом случае. –

+0

не знал о заказе ... теперь мне нужно проверить другие вещи, где я применил: P спасибо. – Yogurtu

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