我有一个对象列表,我需要根据一个字段是否具有唯一值来设置一个字段。
考虑具有两个属性的票证类
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
}
}
答案 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答案。
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;
}
}
答案 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:使用更改将现有列表更新为相同列表。