2013-06-17 2 views
0

У меня есть значения в списке:Выбор отчетливый с определенным условием

List1 
ID groupID testNo 
1  123  0 
2  653  1 
3  776  6 
4  653  0 

Я хочу написать T-Sql или выражение Linq или лямбда, так что всякий раз, когда есть дубликат он должен выбрать один со значением ! = 0

Я использую это выражение, но в основном это не дает результаты, которые я хочу.

var list2 = list1.GroupBy(x => x.testNo).Select(y => y.First()); 

Как получить результаты, чтобы groupID 653 был выбран с testNo 1 с остальными записями?

+0

Возможно ли иметь три повторения или просто дублировать? – PoweredByOrange

+0

Нет только дубликатов. –

+0

вы имеете в виду «всякий раз, когда есть дубликат groupID, он должен выбрать тот, у кого есть testNo! = 0 '? Если да, отредактируйте свой вопрос, чтобы уточнить –

ответ

0

Это должно дать вам желаемые результаты:

var list2 = list1.GroupBy(x => x.groupID) 
       .Select(x => list1.Single(item => item.groupID == x.Key 
           && item.testNo == x.Max(y => y.testNo))) 
       .ToList(); 

В основном, группа по groupID и затем выберите каждый элемент из исходного list1, который соответствует отчетливое groupID и имеет максимальное значение для testNo для этого groupID.

1

Есть несколько подходов, которые вы могли бы предпринять. Я не знаю, является ли какое-либо из них полным доказательством. Можно было бы сделать OrderBy на testNo, чтобы элементы с не нулевой testNo придумает перед теми, с 0.

var list2 = list1.Orderby(y => y.testNo).GroupBy(x => x.testNo).Select(z => z.FirstOrDefault()); 

Если вы можете гарантировать, что testNo = 0 происходит только для простофиль, то самый простой способ это просто использовать где.

var list2 = list1.Where(x => x.testNo > 0).First(); 
0
var result = list.GroupBy(x => x.groupID).Select(g => g.Count() == 1 ? g.First() : g.First(x => x.testNo != 0)); 
Смежные вопросы