LINQ查询并使用结果设置属性。

3

我可以帮忙翻译,这段内容涉及到IT技术。需要根据某个字段是否包含唯一值来设置对象列表中的一个字段。

例如考虑一个票务类,它有两个属性:

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

    public bool IsUnique { get; set; }
}

我收到一张票据清单并将其传递给一个函数:

 IList<Ticket>

我想使用linq来遍历这个列表,如果一个给定的票号在该列表中是唯一的,就将布尔值IsUnique设置为true。

到目前为止,我的代码如下:

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

考虑使用Distinct方法创建一个新的字符串列表,其中包含您的唯一票据。 List<string> NewList = Tickets.Select(x=>x.TicketNumber).Distinct().ToList();编辑:哦,抱歉,我误解了问题。您想标记唯一的票据而不触及重复的票据。 - Ahmet Remzi EKMEKCI
你想要丢弃重复项吗? - Aarif
4个回答

5
这应该可以做到:
foreach (var g in tickets.GroupBy(x => x.TicketNumber))
{
    var unique = !g.Skip(1).Any();
    foreach (var ticket in g)
    {
        ticket.IsUnique = unique;
    }
}

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

3

由于我忽略了代码注释//设置isUnique为true,否则为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;
    }
}

Fiddle: https://dotnetfiddle.net/EgICJr


1
我们只是在操作列表中的项目。我们没有从该列表中删除任何项目。 - Marco
1
当然可以,虽然这个列表现在存储在该变量中,但原始列表并没有改变。您必须将uniqueTickets返回给调用者。 - Marco
1
答案中缺少的是将 IsUnique 设置为 false(如果它不是唯一的),因为我们不知道先前的值。 - Magnus
1
@Magnus 正确。如果唯一,OP只想将unique设置为true。这是我理解他的问题的方式。 - Marco
1
该死 - 我完全忽略了这个注释。 - Marco
显示剩余8条评论

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);
    }
}

0

可以用单个Linq完成。

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

GroupBy: 根据票号分组票务。 Where: 检查票号在分组中不重复。 Select: 选择唯一的票务并将isUnique更新为true。 ToList: 将更改后的现有列表更新到同一列表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接