C# linq查询并使用结果设置属性
我有一个对象列表,需要根据字段是否具有唯一值来设置字段 考虑一个具有两个属性的ticket类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
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答案。
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();