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

C# linq查询并使用结果设置属性,c#,linq,C#,Linq,我有一个对象列表,需要根据字段是否具有唯一值来设置字段 考虑一个具有两个属性的ticket类 public class Ticket { public string TicketNumber { get; set; } public bool IsUnique { get; set; } } 我收到一份票证列表,并将其传递给一个功能: IList<Ticket> IList 我想使用linq迭代这个列表,如果给定的票证号在该列表中是唯一的,那么将bool I

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

考虑一个具有两个属性的ticket类

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

    public bool IsUnique { get; set; }
}
我收到一份票证列表,并将其传递给一个功能:

 IList<Ticket>
IList
我想使用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
        }
    }
public void UpdateTickets(IList票据)
{
foreach(票据中的var票据)
{
//如果ticketNumber出现一次
//将isUnique设置为true,否则为false
}
}

因为我忽略了代码注释
//set是唯一的true,否则false将首选Magnus答案。

  • 按票号/id分组
  • 筛选出包含多个项目的组
  • 将结果展平
  • 生成的集合是那些项目,它们的编号是唯一的
  • public void UpdateTickets(IList票据)
    {
    var uniqueTickets=tickets.GroupBy(t=>t.TicketNumber)
    .Where(t=>t.Count()==1)
    .SelectMany(t=>t);
    foreach(唯一票证中的var票证)
    {
    ticket.IsUnique=true;
    }
    }
    
    小提琴:

    这应该可以做到:

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

    我们将相同编号的车票分组,然后检查组中是否有多个项目。

    我会这样做:

    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);
        }
    }
    
    publicstaticvoidforeach(此IEnumerable可枚举,操作)
    {
    foreach(可枚举中的变量项)
    {
    行动(项目);
    }
    }
    
    它可以在单个Linq中完成

    Tickets.GroupBy(grptckt => grptckt.TicketNumber)
           .Where(tckt => tckt.Count() == 1)
           .Select(val => val.FirstOrDefault().IsUnique = true)
           .ToList();
    
    GroupBy:使用票号对票证进行分组。 其中:在分组中,检查票号未与检查计数重复。 选择:选择唯一票证并将isUnique更新为true。
    ToList:使用对同一列表的更改来更新现有列表。

    考虑使用独特方法创建一个具有唯一票证的新字符串列表
    List NewList=Tickets.Select(x=>x.TicketNumber.Distinct().ToList()编辑:哦,对不起,我误解了这个问题。您希望标记唯一的票证而不接触重复的票证。是否要丢弃重复的票证?我们只处理列表中的项目。我们不会从该列表中删除任何项目当然是可能的,尽管该列表现在存储在该变量中,但原始列表不会更改。您必须将
    uniqueTickets
    返回给调用者。答案中缺少的是将
    IsUnique
    设置为false(如果它不是唯一的),因为我们不知道前面的值。@Magnus correct。OP只想将unique设置为true,如果它是唯一的。这就是我读他的问题的方式。该死的-我完全忽略了这个评论,
    Tickets.GroupBy(grptckt => grptckt.TicketNumber)
           .Where(tckt => tckt.Count() == 1)
           .Select(val => val.FirstOrDefault().IsUnique = true)
           .ToList();