2009-03-03 5 views
0

Select()를 사용하여 구조체 배열의 각 멤버에 대해 계산을 수행했지만 이제는 특정 특성이 최소 인 멤버를 갖기를 원합니다. 선택한 시퀀스에서 Min()과 같은 것을 사용하고 싶었지만 minmal 인 속성이 아닌 전체 구조체를 반환하는 방법을 모르겠습니다. 만약 내가 제대로 이해하고C에서 struct-Array의 최소값

+0

코드를 게시하면 답변을받는 확률이 2 배 높습니다. –

답변

4

(10)는 "값"을 첫 번째 항목을 복용 (최소 값)에 의해 주문에 대한 방법 만 항목을 원하는 경우 물론이다

Persons.OrderBy(p => p.Age).FirstOrDefault(); 

은 (당신이 명시 것입니다) . 또한

:

from p in Persons 
where p.Age == Persons.Select(p1 => p1.Age).Min() 
select p; 

당신에게 최소 값을 가진 모든 항목을 얻을 것이다.

+0

+1. 나는 같은 방식으로 (최소한 한 항목에 대해) 그것을했을 것입니다. –

+0

Jon의 대답은 성능이 좋지만이 것이 더 "내장"되어 있습니다. –

0

, 내가 말하고 싶지만 : 위임을 사용하여 ... 여기

사용하려는 같은 Example from Craig Murphy

public class Person 
{ 
      public int age; 
      public string name; 
      public Person(int age, string name) 
      { 
        this.age = age; 
        this.name = name; 
      } 
} 
// everyone under 25: 
List<person> young = people.FindAll(delegate(Person p) { return p.age < 25; }); 

// sort your list: 
people.Sort(delegate(Person p1, Person p2) 
    { return p1.age.CompareTo(p2.age); }); 
2

는 소리의 MinByMoreLINQ에서 :

public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source, 
    Func<TSource, TKey> selector, IComparer<TKey> comparer) 
{ 
    source.ThrowIfNull("source"); 
    selector.ThrowIfNull("selector"); 
    comparer.ThrowIfNull("comparer"); 
    using (IEnumerator<TSource> sourceIterator = source.GetEnumerator()) 
    { 
     if (!sourceIterator.MoveNext()) 
     { 
      throw new InvalidOperationException("Sequence was empty"); 
     } 
     TSource min = sourceIterator.Current; 
     TKey minKey = selector(min); 
     while (sourceIterator.MoveNext()) 
     { 
      TSource candidate = sourceIterator.Current; 
      TKey candidateProjected = selector(candidate); 
      if (comparer.Compare(candidateProjected, minKey) < 0) 
      { 
       min = candidate; 
       minKey = candidateProjected; 
      } 
     } 
     return min; 
    } 
} 

ThrowIfNull은 확장 방법으로 정의됩니다.

internal static void ThrowIfNull<T>(this T argument, string name) 
    where T : class 
{ 
    if (argument == null) 
    { 
     throw new ArgumentNullException(name); 
    } 
} 
+0

'source.OrderBy (selector, comparer) .FirstOrDefault()'와 어떻게 다른가? –

+0

효율성. OrderBy는 O (n * lg n)입니다. 이것은 O (n)입니다. – configurator

+0

당신은 바로 @configurator입니다. OrderBy의 구현을 살펴 보았습니다. 나는 동의합니다. +1 존. –