2012-01-11 3 views
0

문자열 값에 알 수없는 요소의 목록이 있다고 가정 해 봅시다.이를 n 개의 부분 배열 또는 목록으로 나눕니다 (n은 임의의 int 일 수 있습니다 (예 : n = 3)). 가장 좋은 방법은 무엇입니까? 이 코드는 세 List<string> 목록을 포함 subLists 될 것이다알 수없는 요소 수를 가진 목록을 나눕니다.

var list = new List<string>() { "A", "B", "C", "D", "E", "F", "G" }; 
int groupCount = 3; 

var subLists = list.Select((s, i) => new {Str = s, Index = i}). 
        GroupBy(o => o.Index % groupCount, o => o.Str). 
        Select(coll => coll.ToList()). 
        ToList(); 

:

참고

답변

2

LINQ GroupBySelect 방법이 도움이 각 그룹의 요소의 수는 동일 할 필요는 없다 컬렉션 : {"A", "D", "G"}, {"B", "E"}{"C", "F"} 달성하기 위해서 원래 목록의 요소 인덱스에 대한 그룹화를 기반으로합니다 (위의 링크를 참조하면이를 수행 할 수있는 Select 메서드의 오버로드가 있음). 다른 논리를 사용하여 키를 선택할 수 있습니다.

예를 들어 subListsList<List<string>>입니다. 배열이 필요한 경우 적절한 경우 ToArray을 사용하십시오.

편집 : 그룹화에 모듈러스 연산을 사용하면 목록간에 값이 분산되는 방식에 신경 쓰면 좋지 않을 수 있습니다.

var list = new List<string>() { "A", "B", "C", "D", "E", "F", "G" }; 
int groupCount = 3; 

int maxPerGroup = (int)Math.Ceiling((double)list.Count/groupCount); 

var subLists = list.Select((s, i) => new {Str = s, Index = i}). 
        GroupBy(o => o.Index/maxPerGroup, o => o.Str). 
        Select(coll => coll.ToList()). 
        ToList(); 

이것은 다음과 같은 결과를 생성합니다 : : 아마 더 나은 옵션은이 방법을 수행하는 것입니다 {"A", "B", "C"}{"D", "E", "F"}, {"G"}이 값을 배포 할 더 온건 한 방법이 될 수있다.

요점은 GroupBySelect 방법을 사용하여 필요한 것을 얻을 수 있으며 도메인에 적합한 올바른 그룹화 논리를 제공하기 만하면됩니다.

+0

을 볼 수 콘솔 프로그램 또는 n의 Linqpad 변화 값을

var n = 4; var i = 0; var list = new List<string> { "a", "b", "c", "d", "e", "f", "g" }; var res = list.GroupBy(x => Math.Ceiling((double)++i/n)).Select(x=>x.Select(y=>y).ToList()).ToList(); Console.Write(res); 

쓰기 같은 LINQ이 그것을 할 수 => 여기에 무엇을 의미합니까? 이 경우 각 하위 목록에 누가 액세스합니까? – ikel

+0

@ikel :'=>'은 Lambda Expressions (http://msdn.microsoft.com/en-us/library/bb397687.aspx)의 구문으로, 빵입니다 및 LINQ 코드의 버터. 나는 당신이 아직 LINQ에 있지 않다고 가정합니다. 어쩌면 시도 할 시간인가? 101 LINQ 샘플 (http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b)을 시작하는 것이 좋습니다. – Dyppl

+0

고마워요, 여기에 다시 돌아와야합니다 – ikel

0

교대로, 당신은 효과

관련 문제