使用Linq和List对键值对进行分组

本文关键字:键值对 Linq List 使用 | 更新日期: 2023-09-27 18:00:07

我正在尝试获取一个长的项目列表,一个键/值对,并按键对它们进行分组。这样做,我想得到每个键/值对的计数,这样我以后就可以得到一个加权列表。我生成列表的代码类似于这个示例:

class Notes
    {
        public int NoteId { get; set; }
        public string NoteName { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Notes> _popularNotes = new List<Notes> { 
              new Notes { NoteId = 1, NoteName = "Title 1" }, 
          new Notes { NoteId = 1, NoteName = "Title 1" },
          new Notes { NoteId = 2, NoteName = "Title 2" },
          new Notes { NoteId = 4, NoteName = "Title 4" },
          new Notes { NoteId = 4, NoteName = "Title 4" } };
            foreach (var _note in _popularNotes)
                Console.WriteLine(_note.NoteId + ": " + _note.NoteName);
            IEnumerable<IGrouping<int, string>> _query = _popularNotes.GroupBy(x => x.NoteId, x => x.NoteName);
            foreach (var _noteGroup in _query)
            {
                Console.WriteLine(_noteGroup.Key + ": " + _noteGroup.Count());
            }
            Console.ReadKey();
        }
    } 

这建立了列表并对它们进行分组,我可以获得每个对象的计数,但我无法获得值。我似乎只能拿到钥匙。

我确信有一百万种方法可以做到这一点,我真的在努力选择一种我能理解的方法。我想我只是不明白。

那么,我应该回去通过查找从_popularNotes列表中获取名称吗?或者,是否有其他方法可以实际构建和输出带有键/值对和计数的列表?

使用Linq和List对键值对进行分组

您可以编写_noteGroup.First()

IGrouping<TKey, TElement>是一个IEnumerable<TElement>,这意味着您可以对其进行枚举。

根据IGrouping<TKey, TElement>:文件

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>,
    IEnumerable

换句话说,要吐出键+计数,然后吐出该组中的所有元素(在您的情况下是名称),您可以执行以下操作:

foreach (var _noteGroup in _query)
{
    Console.WriteLine(_noteGroup.Key + ": " + _noteGroup.Count());
    foreach (var name in _noteGroup)
        Console.WriteLine("   " + name);
}