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);
}
}