Здравствуйте, mitix, Вы писали:
M>Спасибо большое! Тогда пока сделаю как обычно, а потом разберусь как самому такой extension method написать...
Господи, чего там разбираться?
public static class MyEnumerable
{
public static TSource Min<TSource, TValue>(
this IEnumerable<TSource> sources,
Func<TSource, TValue> valueSelector)
where TValue : IComparable<TValue>
{
var notSelected = true;
var curValue = default(TValue);
var result = default(TSource);
foreach (var src in sources)
{
var val = valueSelector(src);
if (!notSelected && curValue.CompareTo(val) < 0)
continue;
result = src;
curValue = val;
notSelected = false;
}
return result;
}
}
class Pet
{
public Pet(int age)
{
Age = age;
}
public int Age { get; private set; }
}
class Program
{
static void Main()
{
var min = new[] {new Pet(2), new Pet(10), new Pet(20), new Pet(5) }.Min(pet => pet.Age);
Console.WriteLine(min.Age);
}
}
... <<RSDN@Home 1.2.0 alpha 4 rev. 1082 on Windows Vista 6.0.6001.65536>>
Здравствуйте, mitix, Вы писали:
M>хочу найти елемент, с минимальным значением Property, именно элемент (объект класса A), M>а не само минимальное значение как в этом случае: M>
M>int min = list.Min(a => a.Property);
M>
M>Подскажите, если кто знает, пожалуйста...
Я бы сделал так:
A min = list.Aggregate((left, right) => left.Property < right.Property ? left : right);
Re[4]: LINQ: минимальный элемент последовательности
AVK>class Program AVK>{ AVK> static void Main() AVK> { AVK> var min = new[] {new Pet(2), new Pet(10), new Pet(20), new Pet(5) }.Min(pet => pet.Age); AVK> Console.WriteLine(min.Age); AVK> } AVK>} AVK>[/c#]
Кстати, а как нужно написать запрос, чтобы найти младших животных в каждой "номинации" (Dog, Cat, Mouse)?
А то я тут взялся изучать linq и откровенно туплю...
Re[5]: LINQ: минимальный элемент последовательности
Здравствуйте, mrozov, Вы писали:
M>Кстати, а как нужно написать запрос, чтобы найти младших животных в каждой "номинации" (Dog, Cat, Mouse)? M>А то я тут взялся изучать linq и откровенно туплю...
Не понял вопроса
... <<RSDN@Home 1.2.0 alpha 4 rev. 1090 on Windows Vista 6.0.6001.65536>>
Здравствуйте, mrozov, Вы писали:
M>Кстати, а как нужно написать запрос, чтобы найти младших животных в каждой "номинации" (Dog, Cat, Mouse)? M>А то я тут взялся изучать linq и откровенно туплю...
Например так:
enum PetType
{
Mouse,
Cat,
Dog
}
class Pet
{
public int Age
{
get; set;
}
public PetType Type
{
get; set;
}
public override string ToString()
{
return String.Format("{0} : {1}", this.Type, this.Age);
}
}
class Program
{
static void Main(string[] args)
{
List<Pet> pets = new List<Pet>
{
new Pet {Age = 10, Type = PetType.Mouse},
new Pet {Age = 10, Type = PetType.Mouse},
new Pet {Age = 10, Type = PetType.Mouse},
new Pet {Age = 12, Type = PetType.Mouse},
new Pet {Age = 11, Type = PetType.Mouse},
new Pet {Age = 10, Type = PetType.Dog},
new Pet {Age = 11, Type = PetType.Dog},
new Pet {Age = 12, Type = PetType.Dog},
new Pet {Age = 12, Type = PetType.Cat},
new Pet {Age = 10, Type = PetType.Cat},
new Pet {Age = 11, Type = PetType.Cat},
};
var query = from pet in pets
group pet by pet.Type
into ageGroup
select (from p in ageGroup
orderby p.Age
select p).First();
foreach (Pet pet in query)
{
Console.WriteLine(pet);
}
Console.ReadKey();
}
}
Re[6]: LINQ: минимальный элемент последовательности
Здравствуйте, AndrewVK, Вы писали:
M>>Спасибо большое! Тогда пока сделаю как обычно, а потом разберусь как самому такой extension method написать...
AVK>Господи, чего там разбираться? AVK>
AVK>public static class MyEnumerable
AVK>{
AVK> public static TSource Min<TSource, TValue>(
AVK> this IEnumerable<TSource> sources,
AVK> Func<TSource, TValue> valueSelector)
AVK> where TValue : IComparable<TValue>
AVK> {
AVK> var notSelected = true;
AVK> var curValue = default(TValue);
AVK> var result = default(TSource);
AVK> foreach (var src in sources)
AVK> {
AVK> var val = valueSelector(src);
AVK> if (!notSelected && curValue.CompareTo(val) < 0)
AVK> continue;
AVK> result = src;
AVK> curValue = val;
AVK> notSelected = false;
AVK> }
AVK> return result;
AVK> }
AVK>}
AVK>
И эти люди...?
Флейм, конечно, но std::min_element(first, last, boost::bind(&Pet::age, _1) < boost::bind(&Pet::age, _2)) строк на 20 короче.
Кстати, что эта функция возвращает в случае пустой последовательности?
До последнего не верил в пирамиду Лебедева.
Re[5]: LINQ: минимальный элемент последовательности
Здравствуйте, Roman Odaisky, Вы писали:
RO>И эти люди...?
RO>Флейм, конечно, но std::min_element(first, last, boost::bind(&Pet::age, _1) < boost::bind(&Pet::age, _2)) строк на 20 короче.
Здравствуйте, mrozov, Вы писали:
M>О, спасибо!
M>А где, кстати, можно почитать для начала? А то я какие-то дорелизные примеры находил и они у меня вообще не работают часто
P> class Program
P> {
P> static void Main(string[] args)
P> {
P> var query = from pet in pets
P> group pet by pet.Type
P> into ageGroup
P> select (from p in ageGroup
P> orderby p.Age
P> select p).First();
P> foreach (Pet pet in query)
P> {
P> Console.WriteLine(pet);
P> }
P> Console.ReadKey();
P> }
P> }
P>
Сортировать ради того, чтобы получить минимальный элемент?!!