linq를 사용하여 목록에서 중복 제거 Price)있습니다. 목록이 Items중복 된 항목으로 채워집니다. 예를 들어 :

Items와 수업 이 properties (Id, Name, Code, Price)있습니다.

목록이 Items중복 된 항목으로 채워집니다.

예를 들어 :

1         Item1       IT00001        $100
2         Item2       IT00002        $200
3         Item3       IT00003        $150
1         Item1       IT00001        $100
3         Item3       IT00003        $150

linq를 사용하여 목록에서 중복을 제거하는 방법은 무엇입니까?



답변

var distinctItems = items.Distinct();

일부 속성 만 일치 시키려면 다음과 같이 사용자 정의 등식 비교기를 만듭니다.

class DistinctItemComparer : IEqualityComparer<Item> {

    public bool Equals(Item x, Item y) {
        return x.Id == y.Id &&
            x.Name == y.Name &&
            x.Code == y.Code &&
            x.Price == y.Price;
    }

    public int GetHashCode(Item obj) {
        return obj.Id.GetHashCode() ^
            obj.Name.GetHashCode() ^
            obj.Code.GetHashCode() ^
            obj.Price.GetHashCode();
    }
}

그런 다음 다음과 같이 사용하십시오.

var distinctItems = items.Distinct(new DistinctItemComparer());


답변

var distinctItems = items.GroupBy(x => x.Id).Select(y => y.First());


답변

Distinct 쿼리에서 문제가 발생하면 MoreLinq 를보고 DistinctBy 연산자를 사용하여 id로 고유 한 개체를 선택하십시오.

var distinct = items.DistinctBy( i => i.Id );


답변

이것이 Linq와 함께 그룹화하는 방법입니다. 도움이 되길 바랍니다.

var query = collection.GroupBy(x => x.title).Select(y => y.FirstOrDefault());


답변

Distinct()기본 평등 비교자를 사용하여 값을 비교한다는 점을 명심 하십시오 . 따라서 그 이상을 원하면 자체 비교기를 구현해야합니다.

예를 보려면 http://msdn.microsoft.com/en-us/library/bb348436.aspx 를 참조 하십시오 .


답변

목록에서 중복 항목을 제거하기위한 세 가지 옵션이 있습니다.

  1. 맞춤 평등 비교자를 사용 Distinct(new DistinctItemComparer())하고 @Christian Hayter가 언급 한대로 사용하십시오.
  2. 를 사용 GroupBy하지만 GroupBy그룹별로 묶는 경우 Id항상 중복 항목이 제거되지 않으므로 모든 열을 기준으로 그룹화해야합니다 . 예를 들어 다음 예를 고려하십시오.

    List<Item> a = new List<Item>
    {
        new Item {Id = 1, Name = "Item1", Code = "IT00001", Price = 100},
        new Item {Id = 2, Name = "Item2", Code = "IT00002", Price = 200},
        new Item {Id = 3, Name = "Item3", Code = "IT00003", Price = 150},
        new Item {Id = 1, Name = "Item1", Code = "IT00001", Price = 100},
        new Item {Id = 3, Name = "Item3", Code = "IT00003", Price = 150},
        new Item {Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
    };
    var distinctItems = a.GroupBy(x => x.Id).Select(y => y.First());

    이 그룹화의 결과는 다음과 같습니다.

    {Id = 1, Name = "Item1", Code = "IT00001", Price = 100}
    {Id = 2, Name = "Item2", Code = "IT00002", Price = 200}
    {Id = 3, Name = "Item3", Code = "IT00003", Price = 150}

    {Id = 3, Name = "Item3", Code = "IT00004", Price = 250}중복으로 간주되므로 잘못되었습니다 . 따라서 올바른 쿼리는 다음과 같습니다.

    var distinctItems = a.GroupBy(c => new { c.Id , c.Name , c.Code , c.Price})
                         .Select(c => c.First()).ToList();

    3. 재정의 EqualGetHashCode품목 클래스 :

    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Code { get; set; }
        public int Price { get; set; }
    
        public override bool Equals(object obj)
        {
            if (!(obj is Item))
                return false;
            Item p = (Item)obj;
            return (p.Id == Id && p.Name == Name && p.Code == Code && p.Price == Price);
        }
        public override int GetHashCode()
        {
            return String.Format("{0}|{1}|{2}|{3}", Id, Name, Code, Price).GetHashCode();
        }
    }

    그런 다음 다음과 같이 사용할 수 있습니다.

    var distinctItems = a.Distinct();

답변

보편적 인 확장 방법 :

public static class EnumerableExtensions
{
    public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> enumerable, Func<T, TKey> keySelector)
    {
        return enumerable.GroupBy(keySelector).Select(grp => grp.First());
    }
}

사용 예 :

var lstDst = lst.DistinctBy(item => item.Key);