ChatGPT解决这个技术问题 Extra ChatGPT

获取 List 中不同值的列表

在 C# 中,假设我有一个名为 Note 的类,其中包含三个字符串成员变量。

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}

我有一个 Note 类型的列表:

List<Note> Notes = new List<Note>();

在 Author 列中获取所有不同值的列表的最简洁方法是什么?

我可以遍历列表并将所有不重复的值添加到另一个字符串列表中,但这似乎很脏且效率低下。我有一种感觉,有一些神奇的 Linq 构造可以在一行中完成此操作,但我无法想出任何东西。


K
Kirk Woll
Notes.Select(x => x.Author).Distinct();

这将返回 Author 个值的序列 (IEnumerable<string>) - 每个唯一值一个。


Notes.Select(x => x.Author).AsParallel().Distinct();如果我们不关心顺序并且列表中有更多项目,“AsParallel()”可能会带来一些性能优势。
@Kiquenet,考虑到 Default 相等比较器是不同的。 msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx
我们需要在 .Distinct() 之前添加 ToList() 吗?
不是在 Distinct() 之前,而是在之后,如果您尝试转换为列表。例如:Notes.Select(x => x.Author).Distinct().ToList();
@Kirk 字符串的 IEnumerable 仍然称为“作者”还是已更改为匿名?如何在对列应用不同后命名列?谢谢
M
Mohammad Atiour Islam

按作者区分 Note 类

var DistinctItems = Notes.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}

它不应该是 NotesNotes.GroupBy() 中的复数 s,因为 Note 只能容纳一个单注吗?
C
Chad Levy

Jon Skeet 编写了一个名为 morelinq 的库,其中包含一个 DistinctBy() 运算符。有关实施,请参见 here。你的代码看起来像

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);

更新:重新阅读您的问题后,如果您只是在寻找一组不同的作者,柯克有正确的答案。

添加了示例,DistinctBy 中的几个字段:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();

非常好,谢谢。如果我在调用 Distinct 方法之前对列表进行排序,我喜欢它保持正确的顺序。
我更新了链接。 MoreLINQ 现在在 Github 上,可以通过 Nuget 安装:Install-Package morelinq
L
Lauren Rutledge
public class KeyNote
{
    public long KeyNoteId { get; set; }
    public long CourseId { get; set; }
    public string CourseName { get; set; }
    public string Note { get; set; }
    public DateTime CreatedDate { get; set; }
}

public List<KeyNote> KeyNotes { get; set; }
public List<RefCourse> GetCourses { get; set; }    

List<RefCourse> courses = KeyNotes.Select(x => new RefCourse { CourseId = x.CourseId, Name = x.CourseName }).Distinct().ToList();

通过使用上述逻辑,我们可以得到唯一的Course


你在 ToList 之前的 Distinct 节省了我的时间。我在 ToList 之后做,并给出了无法将列表转换为 Ienumerable 的错误。
Distinct 在这里不起作用,因为对于这个运算符,每个对象都是唯一的,基于对象的哈希码。你需要一些类似的 - github.com/morelinq/MoreLINQ/blob/master/MoreLinq/DistinctBy.cs
B
Brad Koch
mcilist = (from mci in mcilist select mci).Distinct().ToList();

mci到底是什么?只是一个示例表?答案有点尴尬。
是的,我认为这不是我最初的问题所要寻找的(没关系,那是一年半前的事了,该项目早就完成了)。据我所知,如果我已经有一个可能包含重复项的作者字符串列表,但不能用于从将作者字符串作为其字段之一的对象列表中提取这样的列表,这将起作用。