LINQ: минимальный элемент последовательности
От: mitix Россия  
Дата: 23.05.08 11:34
Оценка:
Начал изучать LINQ. Сразу столкнулся с такой проблемой.

предположим:


public class A
{
    public int Property { get; set; }
}
...
public void Method()
{
    List<A> list = new List<A>();
    //далее list забивается значениями
}

хочу найти елемент, с минимальным значением Property, именно элемент (объект класса A),
а не само минимальное значение как в этом случае:
int min = list.Min(a => a.Property);


Подскажите, если кто знает, пожалуйста...
Заранее спасибо!
Re: LINQ: минимальный элемент последовательности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.05.08 11:56
Оценка:
Здравствуйте, mitix, Вы писали:

M>Подскажите, если кто знает, пожалуйста...


Готового ничего нет, но самому сделать такой метод совсем несложно.
... <<RSDN@Home 1.2.0 alpha 4 rev. 1082 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: LINQ: минимальный элемент последовательности
От: mitix Россия  
Дата: 23.05.08 12:04
Оценка:
Спасибо большое! Тогда пока сделаю как обычно, а потом разберусь как самому такой extension method написать...
Re[3]: LINQ: минимальный элемент последовательности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.05.08 12:25
Оценка: 9 (1)
Здравствуйте, 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>>
AVK Blog
Re: LINQ: минимальный элемент последовательности
От: Аноним  
Дата: 24.05.08 02:05
Оценка: 10 (3)
Здравствуйте, 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: минимальный элемент последовательности
От: mrozov  
Дата: 28.05.08 11:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:


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: минимальный элемент последовательности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.05.08 12:00
Оценка:
Здравствуйте, mrozov, Вы писали:

M>Кстати, а как нужно написать запрос, чтобы найти младших животных в каждой "номинации" (Dog, Cat, Mouse)?

M>А то я тут взялся изучать linq и откровенно туплю...

Не понял вопроса
... <<RSDN@Home 1.2.0 alpha 4 rev. 1090 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[5]: LINQ: минимальный элемент последовательности
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 28.05.08 12:10
Оценка: 6 (1)
Здравствуйте, 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: минимальный элемент последовательности
От: mrozov  
Дата: 28.05.08 12:48
Оценка:
О, спасибо!

А где, кстати, можно почитать для начала? А то я какие-то дорелизные примеры находил и они у меня вообще не работают часто
Re[4]: LINQ: минимальный элемент последовательности
От: Roman Odaisky Украина  
Дата: 28.05.08 13:04
Оценка: +1
Здравствуйте, 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: минимальный элемент последовательности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.05.08 13:20
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>И эти люди...?


RO>Флейм, конечно, но std::min_element(first, last, boost::bind(&Pet::age, _1) < boost::bind(&Pet::age, _2)) строк на 20 короче.


Re: LINQ: минимальный элемент последовательности
Автор:
Дата: 24.05.08


RO>Кстати, что эта функция возвращает в случае пустой последовательности?


Какая?
... <<RSDN@Home 1.2.0 alpha 4 rev. 1090 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[7]: LINQ: минимальный элемент последовательности
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 28.05.08 13:39
Оценка:
Здравствуйте, mrozov, Вы писали:

M>О, спасибо!


M>А где, кстати, можно почитать для начала? А то я какие-то дорелизные примеры находил и они у меня вообще не работают часто


Language-Integrated Query (LINQ)
LINQ Query Expressions (C# Programming Guide)
C# in Depth: What you need to master C# 2 and 3 Query expressions and LINQ to Objects
Re[5]: LINQ: минимальный элемент последовательности
От: Аноним  
Дата: 28.05.08 13:41
Оценка: +1
Здравствуйте, Roman Odaisky, Вы писали:

RO>Кстати, что эта функция возвращает в случае пустой последовательности?

default

null — для ссылочных и типов, и забитый нулями struct для значимых (что уже неприятненько ввиду отсутствия конструктора по умолчанию у оных )
Re[6]: LINQ: минимальный элемент последовательности
От: dotneter  
Дата: 28.05.08 13:55
Оценка:
Имхо, так красивше
var query = from pet in pets
            group pet by pet.Type into ageGroup
            let minAge = ageGroup.Min(x => x.Age)
            select ageGroup.First(x => x.Age == minAge);
... << RSDN@Home 1.2.0 alpha rev. 789>>
Talk is cheap. Show me the code.
Re[6]: LINQ: минимальный элемент последовательности
От: Lloyd Россия  
Дата: 28.05.08 14:56
Оценка:
Здравствуйте, pt4h, Вы писали:

P>Например так:


P>

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>


Сортировать ради того, чтобы получить минимальный элемент?!!
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.