linq查询并使用结果来设置属性

时间:2019-04-11 08:11:07

标签: c# linq

我有一个对象列表,我需要根据一个字段是否具有唯一值来设置一个字段。

考虑具有两个属性的票证类

public class Ticket
{
    public string TicketNumber { get; set; }

    public bool IsUnique { get; set; }
}

我收到票证清单,并将其传递给函数:

 IList<Ticket>

我要使用linq遍历此列表,如果给定的票证号码在该列表中是唯一的,请将bool IsUnique设置为true。

到目前为止,我有以下内容

public void UpdateTickets(IList<Ticket> Tickets)
    {
        foreach (var ticket in tickets)
        {
            // if ticketNumber occurs once
            // set isUnique to true, otherwise false
        }
    }

4 个答案:

答案 0 :(得分:5)

这应该做到:

foreach (var g in tickets.GroupBy(x => x.TicketNumber))
{
    var unique = !g.Skip(1).Any();
    foreach (var ticket in g)
    {
        ticket.IsUnique = unique;
    }
}

我们将具有相同编号的票归为一组,然后检查该组中是否有1件以上。

答案 1 :(得分:3)

由于我忽略了代码注释// set isUnique to true, otherwise false首选Magnus答案。

  1. 按机票编号/ id分组
  2. 过滤出包含多个项目的组
  3. 将结果放平
  4. 最终的集合是那些项目,这些项目的编号是唯一的
public void UpdateTickets(IList<Ticket> tickets)
{
    var uniqueTickets = tickets.GroupBy (t => t.TicketNumber)
        .Where (t => t.Count () == 1)
        .SelectMany (t => t);

    foreach (var ticket in uniqueTickets)
    {
        ticket.IsUnique = true;
    }
}

提琴:https://dotnetfiddle.net/EgICJr

答案 2 :(得分:0)

我会做这样的事情:

tickets.GroupBy(t => t.TicketNumber)
    .Where(g => g.Count() == 1)
    .ForEach(g => g.ForEach(t => t.IsUnique = true));

我需要此扩展方法来启用.ForEach()语法:

public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach (var item in enumerable)
    {
        action(item);
    }
}

答案 3 :(得分:0)

可以在单个Linq中完成。

Tickets.GroupBy(grptckt => grptckt.TicketNumber)
       .Where(tckt => tckt.Count() == 1)
       .Select(val => val.FirstOrDefault().IsUnique = true)
       .ToList();

GroupBy:用票号对票进行分组。 其中:分组中的检查票号不重复检查计数。 选择:选择唯一的票证并将isUnique更新为true。 ToList:使用更改将现有列表更新为相同列表。