당신은 매우 효율적으로이 문제를 해결하기 위해 group by
를 사용할 수 있습니다
당신에게 각 그룹은 동일한있는 모든 객체를 포함하는 그룹의 순서를 줄 것이다
var grouped =
from item in myClassList
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};
지정된 등록 정보의 값. 예를 들어
, 당신은 이런 식으로 뭔가를 할 수 그룹의 결과 시퀀스의 각 그룹에있는 모든 항목을 반복하기 :이 각 속성의 유형을 구현 있다고 가정
foreach (var group in grouped)
{
foreach (var item in group)
{
// Do something with item
}
}
참고 IEquatable<T>
및 GetHashCode()
.출력 위
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
class Data
{
public string Name { get; set; }
public int Property1 { get; set; }
public int Property2 { get; set; }
public int Property3 { get; set; }
public int Property4 { get; set; }
public int Property5 { get; set; }
public int Property6 { get; set; }
public int Property7 { get; set; }
public int Property8 { get; set; }
public int Property9 { get; set; }
public int Property10 { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Data> myClassList = new List<Data>
{
new Data {Name = "1A", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "1B", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "1C", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "2A", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "2B", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "2C", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "3A", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
new Data {Name = "3B", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
new Data {Name = "3C", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
};
var grouped =
from item in myClassList
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};
foreach (var group in grouped)
{
Console.WriteLine(string.Join(", ", group.Select(item => item.Name)));
}
}
}
}
예 :, 당신은 할 수 아래 @BertPersyn에서 언급 한 바와 같이 PLINQ
를 사용
1A, 1B, 1C
2A, 2B, 2C
3A, 3B, 3C
가능한 최적화 여기
은 컴파일 가능한 예제 PLINQ를 사용하여 속도를 높일 수도 있습니다. 는이를 위해 단순히 (.AsParallel()
의 추가주의) grouped
을 생성하려면 다음을 사용 : var grouped =
from item in myClassList.AsParallel()
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};
가 확인하려면이 실제로 일을 속도를하는 경우, 당신이 어떤 타이밍을 수행하는 것이 필수적이다.
'FindAll' 대신'Where()'를 사용하십시오. – geo
이 큰 목록의 출처는 무엇입니까? SQL 데이터베이스에서 오는 경우 쿼리에 좋은 WHERE 절을 추가하는 것이 더 효율적일 수 있습니다. 또한 목록이 정렬 된 경우 도움이 될 수 있습니다. 그런 다음 해당 순서를 악용하도록 코드를 다시 작성할 수 있습니다. –
@geo : 비슷한 결과를 얻은 것 같습니다. – flo