C# 从列表中获取唯一记录,而不影响列表的实际顺序

C# 从列表中获取唯一记录,而不影响列表的实际顺序,c#,linq,C#,Linq,我正试图从列表中提取不同的记录。我的代码正在获取不同的记录,但它正在更改列表的顺序。如何在不影响数据顺序的情况下获取记录 我正在使用这个代码 var data= data1.GroupBy(x => x.CourseId).Select(g => g.First()); 或 给出相同输出顺序的两个查询 请帮忙! 谢谢 Deepika我不是100%的,它会回答您的问题,但您可以尝试使用C#中的“.Distinct()”函数 var data=data1.Distinct(); 或 v

我正试图从列表中提取不同的记录。我的代码正在获取不同的记录,但它正在更改列表的顺序。如何在不影响数据顺序的情况下获取记录

我正在使用这个代码

var data= data1.GroupBy(x => x.CourseId).Select(g => g.First());

给出相同输出顺序的两个查询

请帮忙! 谢谢
Deepika

我不是100%的,它会回答您的问题,但您可以尝试使用C#中的“.Distinct()”函数

var data=data1.Distinct(); 或
var data=data1.Distinct(x=>x.CourseId)

添加一行新代码:

data  = (from o in data order by o.sortproperty Ascending).toList();

您可以尝试此测试代码。它给出了一个不同项目的列表,而不改变原始顺序

 class Program
    {
        static void Main(string[] args)
        {
            List <Person> P_list = new List<Person>();
            P_list.Add(new Person("Jack", "Harvey", "Smyrna, GA 30080"));
            P_list.Add(new Person("Tyler", "Marsden", "Iowa City, IA 52240"));
            P_list.Add(new Person("Callum", "Richardson ", "Marquette, MI 49855"));
            P_list.Add(new Person("Taylor", "Craig ", "Logan, UT 84321"));
            P_list.Add(new Person("Callum", "Richardson ", "Marquette, MI 49855"));
            P_list.Add(new Person("Tyler", "Marsden", "Iowa City, IA 52240"));
            P_list.Add(new Person("William", "Donnelly", "Richmond, IN 47374"));
            P_list.Add(new Person("Callum", "Richardson ", "Marquette, MI 49855"));
            P_list.Add(new Person("Jack", "Harvey", "Smyrna, GA 30080"));
            P_list.Add(new Person("Billy", "Reid ", "New York, NY 10029"));            

            IEnumerable<Person> distinct = P_list.Distinct(new PersonComparer());
            foreach (var item in distinct)
            {
                Console.WriteLine("{0} {1} {2}", item.FName,item.LName,item.Location);
            }
            Console.Read();
        }

    }

    class Person
    {
        public string FName { get; set; }
        public string LName { get; set; }
        public string Location { get; set; }
        public Person(string f, string l, string loc)
        {
            FName = f;
            LName = l;
            Location = loc;
        }
    }

    public class PersonComparer : IEqualityComparer<Person>
    {
        bool IEqualityComparer<Person>.Equals(Person x, Person y)
        {
            return (x.FName == y.FName & x.LName == y.LName && x.Location == y.Location);
        }

        int IEqualityComparer<Person>.GetHashCode(Person obj)
        {
            string person = string.Format("{0} {1} {2}", obj.FName, obj.LName, obj.Location);
            return person.GetHashCode();
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
列表P_List=新列表();
P_列表。添加(新人(“杰克”、“哈维”、“士麦那,GA 30080”);
P_列表。添加(新人(“泰勒”、“马斯登”、“爱荷华州爱荷华市,IA 52240”);
P_列表。添加(新人物(“Callum”、“Richardson”、“Marquette,MI 49855”);
P_列表。添加(新人(“泰勒”、“克雷格”、“洛根,UT 84321”);
P_列表。添加(新人物(“Callum”、“Richardson”、“Marquette,MI 49855”);
P_列表。添加(新人(“泰勒”、“马斯登”、“爱荷华州爱荷华市,IA 52240”);
P_列表。添加(新人物(“威廉”、“唐纳利”、“里士满,47374”);
P_列表。添加(新人物(“Callum”、“Richardson”、“Marquette,MI 49855”);
P_列表。添加(新人(“杰克”、“哈维”、“士麦那,GA 30080”);
P_列表。添加(新人(“比利”、“里德”、“纽约州纽约市10029”);
IEnumerable distinct=P_list.distinct(new PersonComparer());
foreach(独立的var项目)
{
WriteLine(“{0}{1}{2}”,item.FName,item.LName,item.Location);
}
Console.Read();
}
}
班主任
{
公共字符串FName{get;set;}
公共字符串LName{get;set;}
公共字符串位置{get;set;}
公众人物(字符串f、字符串l、字符串loc)
{
FName=f;
LName=l;
位置=loc;
}
}
公共类人员比较:IEqualityComparer
{
bool IEqualityComparer.Equals(人x,人y)
{
返回(x.FName==y.FName&x.LName==y.LName&&x.Location==y.Location);
}
int IEqualityComparer.GetHashCode(Person obj)
{
string person=string.Format(“{0}{1}{2}”,obj.FName,obj.LName,obj.Location);
return person.GetHashCode();
}
}

您应该使用
distinct()
相等比较程序

class CourseDetails
{
    public CourseDetails(int id)
    {
        Id = id;
    }
    public int Id { get; }
}

class CourseDetailsEqualityComparer : EqualityComparer<CourseDetails>
{
    public override bool Equals(CourseDetails x, CourseDetails y)
    {
        return x.Id == y.Id;
    }

    public override int GetHashCode(CourseDetails obj)
    {
        return obj.Id.GetHashCode();
    }
}

[TestMethod]
public void FindDistinct()
{
    var courses = new List<CourseDetails> { 
        new CourseDetails(4),
        new CourseDetails(2),
        new CourseDetails(3),
        new CourseDetails(2),
        new CourseDetails(3),
        new CourseDetails(1),
        new CourseDetails(1),
    };

    var expected = new List<CourseDetails> {
        new CourseDetails(4),
        new CourseDetails(2),
        new CourseDetails(3),
        new CourseDetails(1),
    };

    var distinct = courses.Distinct(new CourseDetailsEqualityComparer()).ToList();

    CollectionAssert.AreEqual(expected, distinct, new CourseDetailsComparer());
}

class CourseDetailsComparer : Comparer<CourseDetails>
{
    public override int Compare(CourseDetails x, CourseDetails y)
    {
        return x.Id.CompareTo(y.Id);
    }
}
课程详情
{
公共课程详细信息(int id)
{
Id=Id;
}
公共int Id{get;}
}
班级课程详细资格比较:平等比较
{
公共覆盖布尔等于(CourseDetails x,CourseDetails y)
{
返回x.Id==y.Id;
}
公共覆盖int GetHashCode(CoursedDetails obj)
{
返回obj.Id.GetHashCode();
}
}
[测试方法]
公共无效FindDistinct()
{
var courses=新列表{
新课程详情(4),
新课程详情(2),
新课程详情(3),
新课程详情(2),
新课程详情(3),
新课程详情(1),
新课程详情(1),
};
var预期值=新列表{
新课程详情(4),
新课程详情(2),
新课程详情(3),
新课程详情(1),
};
var distinct=courses.distinct(新CourseDetailsEqualityComparer()).ToList();
CollectionAssert.AreEqual(预期的、不同的、新课程的TailsComparer());
}
课程详细信息比较者:比较者
{
公共覆盖整数比较(CourseDetails x,CourseDetails y)
{
返回x.Id.CompareTo(y.Id);
}
}

我无法复制此内容。你能举个例子吗?你所说的在不影响数据顺序的情况下获取记录是什么意思?除非指定
OrderBy
,否则没有授予的默认订单。无论数据1中的订单是什么,我都需要相同顺序的记录,但我正在使用的更改订单或REC的代码不能保证以与原始显示相同的顺序返回项目,但有些人认为这是实现它的唯一自然方式。
Distinct
不能将lamba/属性作为参数。一个人需要使用一个相等的比较程序。如果尝试使用类(OP具有具有CourseId属性的对象)
Distinct
将看到每个对象都是唯一的,除非覆盖类的
Equals
方法。这没有帮助。问题明确指出“不影响实际订单”
class CourseDetails
{
    public CourseDetails(int id)
    {
        Id = id;
    }
    public int Id { get; }
}

class CourseDetailsEqualityComparer : EqualityComparer<CourseDetails>
{
    public override bool Equals(CourseDetails x, CourseDetails y)
    {
        return x.Id == y.Id;
    }

    public override int GetHashCode(CourseDetails obj)
    {
        return obj.Id.GetHashCode();
    }
}

[TestMethod]
public void FindDistinct()
{
    var courses = new List<CourseDetails> { 
        new CourseDetails(4),
        new CourseDetails(2),
        new CourseDetails(3),
        new CourseDetails(2),
        new CourseDetails(3),
        new CourseDetails(1),
        new CourseDetails(1),
    };

    var expected = new List<CourseDetails> {
        new CourseDetails(4),
        new CourseDetails(2),
        new CourseDetails(3),
        new CourseDetails(1),
    };

    var distinct = courses.Distinct(new CourseDetailsEqualityComparer()).ToList();

    CollectionAssert.AreEqual(expected, distinct, new CourseDetailsComparer());
}

class CourseDetailsComparer : Comparer<CourseDetails>
{
    public override int Compare(CourseDetails x, CourseDetails y)
    {
        return x.Id.CompareTo(y.Id);
    }
}