2012-10-21 2 views
-2

List가 있습니다. SomeObject는 TargetObject 속성을 갖습니다. SomeObject가 TargetObject를 따르는 List를 생성해야합니다.콜렉션 정렬 매개 변수 별 linq 쿼리

SO_1 (TO_1) | SO_2 (TO_2) | SO_3 (TO_3) | SO_4 (TO_1) | SO_5 (TO_1) | SO_6 (TO_1) | SO_7 (TO_1) | SO_8 (TO_2) | SO_9 (TO_2) | SO_10

SO_1 (TO_1)로 설정되어 있어야합니다 (TO_4) | SO_2 (TO_2) | SO_3 (TO_3) | SO_10 (TO_4) | SO_4 (TO_1) | SO_8 (TO_2) | SO_6 (TO_1) | SO_9 (TO_2) | SO_7 (TO_1) | SOD5 (TO_1)

결국 MaxDegreeOfParallelism = 5로 Parallel.ForEach (List)를 실행하여 5 개 항목의 각 루프가 동시에 동일한 TargetObject를 가질 수 없습니다.

감사

+2

질문을 다시 말하면 좋겠습니까? – Rockstart

+0

나는 ..., 할 수있는 최선의 설명은, ...에서 컬렉션을 바꾸는 것이 나쁘다. – eugeneK

답변

0

다른 용도로 사용하는 InterlaceBy 확장 방법입니다.하지만 귀하의 경우에 적용되는 것으로 보입니다.

List<int> list = new List<int>() {1,2,3,1,1,1,1,2,2,4 }; //your TO's 
var newlist = list.InterlaceBy(x => x).ToList(); //1,2,3,4,1,2,1,2,1,1 

public static partial class MyExtensions 
{ 
    public static IEnumerable<T> InterlaceBy<T, S>(this IEnumerable<T> input, Func<T, S> selector) 
    { 
     return input 
       .GroupBy(selector) 
       .SelectMany(g => g.Select((x, i) => new { key = i, value = x })) 
       .OrderBy(x => x.key) 
       .Select(x => x.value); 
    } 
} 
+1

나를 이해해 주셔서 감사합니다. – eugeneK

1

가장 쉬운 방법은 TargetObject에 의해, (적어도 내가 생각할 수있는 가장 쉬운 방법) 첫째 TargetObject별로 정렬하는 것입니다 다음 그룹화를 수행하고 당신에게 각 그룹의 한 요소를 사용하여 수집을 다시 시각.

List<SomeObject> CustomSort(List<SomeObject> list) 
{ 

    var ordered = list.OrderBy(x => x.TargetObject); // might not be necessary. Not sure if group by orders the group or not. 
    var groups = ordered.GroupBy(x => x.x.TargetObject); 
    List<SomeObject> res = new List<SomeObject>(); 

    int position = 0; 
    while(res.Count < list.Count) 
    { 
    foreach (var grp in groups) 
    { 
     SomeObject current = grp.ElementAtOrDefault(position); 
     if (current != null) res.Add(current); 
    } 
    position ++; 
    } 
    return res; 
} 

추신 :이 코드는 최적화되지 않았지만 접근법을 보여주기위한 것입니다.