LINQ-C中的区别#

时间:2017-05-30 04:37:52

标签: c# linq

我有以下列表和查询表达式来获取不同的列表。

 List<LinqTest> myList = new List<LinqTest>();
 myList.Add(new LinqTest() { id = 1, value = "a" });
 myList.Add(new LinqTest() { id = 1, value = "b" });
 myList.Add(new LinqTest() { id = 2, value = "c" });
 myList.Select(m => new { m.id}).Distinct().ToList();

我已在下面提到了SO链接link以获取代码。即使在使用distinct()之后我也会获得具有重复值的3条记录。 可能是什么原因?

6 个答案:

答案 0 :(得分:4)

您在调试时看到的3条记录是您现有的列表。我认为你错过的只是一项任务。

List<LinqTest> myList = new List<LinqTest>();
myList.Add(new LinqTest() { id = 1, value = "a" });
myList.Add(new LinqTest() { id = 1, value = "b" });
myList.Add(new LinqTest() { id = 2, value = "c" });
// not sure why new {m.id} was used in this context
List<int> distinctList = myList.Select(m => m.id).Distinct().ToList();

答案 1 :(得分:2)

在您的情况下,Distinct()方法使用anonimous类型对象的默认相等比较器。因此,结果不是预期的。如果您想获得唯一的id值,请使用

List<int> ListOfIDs = myList.Select(m => m.id).Distinct().ToList();

如果您想获得自定义类型的不同对象,则需要实现IEquatable通用接口,并为该类型提供自己的GetHashCodeEquals方法。有关详细信息,请参阅MSDN

答案 2 :(得分:2)

您没有将不同的列表存储到任何地方。更改最后一行,将不同的值分配给新变量。

 var distinctList = myList.Select(m => new { m.id}).Distinct().ToList();

答案 3 :(得分:1)

将您的选择更改为.Select(m => m.id),您正在创建id为其属性的新对象,然后在获得distinct之后,比较对象时不会提供您需要的确切不同对象。你需要具体,如果你需要通过对象的属性来区分,那么使用GROUP BY或MoreLinq,DistinctBy方法。检查以下问题的答案

Distinct in Linq based on only one field of the table

答案 4 :(得分:0)

使用GroupBy,

var result  = myList 
  .GroupBy(p => p.id)
  .Select(g => g.First())
  .ToList();

答案 5 :(得分:0)

以下是执行此操作的示例(请注意EqualsGetHashCode方法):

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<LinqTest> myList = new List<LinqTest>();
            myList.Add(new LinqTest() { Id = 1, Value = "a" });
            myList.Add(new LinqTest() { Id = 1, Value = "b" });
            myList.Add(new LinqTest() { Id = 2, Value = "c" });

            var distinct = myList.Distinct().ToList();
        }

        class LinqTest
        {
            public override bool Equals(object obj)
            {
                var that = obj as LinqTest;
                return that == null ? false : Id == that.Id;
            }

            public override int GetHashCode()
            {
                return Id;
            }

            public int Id { get; set; }
            public string Value { get; set; }
        }
    }
}