2015-07-08 2 views
1

У меня есть класс ABC как этотПолучить минимальное значение из списка

public class ABC{ 
public int Id {get;set;} 
public int UserCount {get;set;} 
} 

Теперь я добавить следующие записи в список типа ABC

List<ABC> lstABC = new List<ABC>(); 
lstABC.Add(new ABC(){Id=1,UserCount=5}); 
lstABC.Add(new ABC(){Id=2,UserCount=15}); 
lstABC.Add(new ABC(){Id=3,UserCount=3}); 
lstABC.Add(new ABC(){Id=4,UserCount=20}); 

Я еще один список типа междунар

Теперь я хочу найти минимальное значение UserCount, если нужно сравнить список, указанный на сайте: Id в lstABC должны соответствовать пунктам presesnt в lstIds. Я могу получить минимальное значение UserCount с помощью циклов, но есть ли другой способ получить значение оптимизированным образом, избегая циклов?

ответ

1

Вы можете использовать Enumerable.Join связать оба списка:

var joined = from id in lstIds 
      join x in lstABC 
      on id equals x.Id 
      select x; 
int minValue = joined.Min(x => x.UserCount); 

Это более эффективно, чем петли, так как Join использует набор, чтобы найти соответствующие пункты.

Там больше чем один способ кожи кошки, это немного менее эффективным:

int minValue = lstABC.Where(x => lstIds.Contains(x.ID)).Min(x => x.UserCount); 
+0

Я пойду с первым подходом .. второй подход создаст проблему для идентификаторов '1' и' 11'. Спасибо :) –

+0

@SidM: «Содержит» не является подстрочным подходом. 'lstIds' - это список« Список »и' List.Contains', если в списке есть хотя бы один номер с одним и тем же идентификатором и '1! = 11'. –

+0

Еще раз спасибо спасибо :) –

0

Try ниже код:

 int min = lstABC.Min(entry => entry.UserCount); 
     var a = lstABC.Where(e => e.UserCount == min).FirstOrDefault(); 
     var resul = lstIds.Where(e => e.Equals(a.Id)).FirstOrDefault(); 
     var result = lstABC.Where(n =>n.Id == resul).FirstOrDefault(); 
Смежные вопросы