【问题标题】:Using LINQ to get all object with the same value property?使用 LINQ 获取具有相同值属性的所有对象?
【发布时间】:2020-01-05 00:37:50
【问题描述】:

我有一个这样的项目列表:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item3: Id=3, Name="Test2"

我想要做的是得到这样的精简列表:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"

所以基本上我希望拥有与给定属性具有相同值的项目。 所以所有具有相同属性值的项目。

我已尝试将它们分组,但我不知道下一步该做什么。

items.OrderBy(x => x.Name);

编辑解释。

似乎我没有理解这个问题。答案是预期的,但这里已经有解决方案:

Right answer!

【问题讨论】:

  • 请问您打算在该清单中包含多少项目?
  • 您的示例结果列表是否正确?第二项不应该是Item2: Id=2, Name="Test2"吗?
  • 你编辑的解释还是有点神秘。项目 Id=4 和 5 也具有相同的名称。为什么他们被排除在外?
  • @OlivierJacot-Descombes 你是对的,这是我的错,误解了这个问题。

标签: c# linq


【解决方案1】:

使用这个输入...

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item3: Id=3, Name="name3"
Item4: Id=4, Name="Test2"
Item5: Id=5, Name="name1"
Item6: Id=6, Name="name3"

...这会让所有项目多次出现:

var result = items
    .GroupBy(x => x.Name)        // Group by name
    .Where(g => g.Count() > 1)   // Select only groups having duplicates
    .SelectMany(g => g);         // Ungroup (flatten) the groups

结果:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item5: Id=5, Name="name1"
Item3: Id=3, Name="name3"
Item6: Id=6, Name="name3"

...这会获取所有出现不止一次的项目并重新编号

var result = items
    .GroupBy(x => x.Name)        // Group by name
    .Where(g => g.Count() > 1)   // Select only groups having duplicates
    .SelectMany(g => g)          // Ungroup (flatten) the groups
    .Select((x, i) => new Item { Id = i + 1, Name = x.Name });

结果:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item3: Id=3, Name="name1"
Item4: Id=4, Name="name3"
Item5: Id=5, Name="name3"

请注意,Select 具有提供从零开始的索引的重载。

Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,TResult>)

但是,您的示例输入过于简单,因此很难说出您期望在更复杂的情况下会发生什么。

如果您想要具有特定名称的条目:

string specificName = "name1";
var result = items
    .Where(x => x.Name == specificName);

【讨论】:

    【解决方案2】:

    按名称对项目进行分组,然后从每个组中选择第一项存储到简化列表中:

    var groupedItems = items.GroupBy(x => x.Name).Select(g => g.First()).ToList();
    

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2020-10-20
      相关资源
      最近更新 更多