C# 获取每个项目的最大值通用列表
我想知道你是否能帮忙 我有一份信息清单 客户号 序列号 这可能包含以下数据: Cli编号:0000001,序号:1C# 获取每个项目的最大值通用列表,c#,linq,C#,Linq,我想知道你是否能帮忙 我有一份信息清单 客户号 序列号 这可能包含以下数据: Cli编号:0000001,序号:1 Cli编号:0000001,序号:2 Cli编号:0000001,序号:3 Cli编号:0000001,序号:3 Cli编号:0000002,序号:1 Cli编号:0000002,序号:1 Cli编号:0000002,序号:2 Cli编号:0000002,序号:2 我想生成一个最大序列号的列表 请注意,根据上述示例,序列号可能重复多次 因此,我想从示例中得出的列表如下: Cli编号
Cli编号:0000001,序号:2
Cli编号:0000001,序号:3
Cli编号:0000001,序号:3
Cli编号:0000002,序号:1
Cli编号:0000002,序号:1
Cli编号:0000002,序号:2
Cli编号:0000002,序号:2
我想生成一个最大序列号的列表 请注意,根据上述示例,序列号可能重复多次 因此,我想从示例中得出的列表如下: Cli编号:0000001,序号:3
Cli编号:0000001,序号:3
Cli编号:0000002,序号:2
Cli编号:0000002,序号:2
我试过了
var x = criticalNotesData.OrderBy(y => y.ClientNo)
.ThenBy(z => z.SequenceNo).ToList();
var m = x.Max(r => r.SequenceNo).ToList();
但是max只是在列表中提供max序列号,而不是每个客户机
谢谢
David您需要GroupBy
var maxItems = criticalNotesData.GroupBy(p => p.ClientNo)
.Select(r => r.Max(q => q.SeqNo));
类似这样的东西。或 你需要团员
var maxItems = criticalNotesData.GroupBy(p => p.ClientNo)
.Select(r => r.Max(q => q.SeqNo));
类似这样的东西。或
我不能尝试,但我认为这应该有效
var m = x.GroupBy(r => r.ClientNo).Select(g => g.Max(x => x.SequenceNo));
编辑:了解客户:
var m = x.GroupBy(r => r.ClientNo).Select(g => new { ClientID = g.Key, Max = g.Max(x => x.SequenceNo) });
我不能尝试,但我认为这应该有效
var m = x.GroupBy(r => r.ClientNo).Select(g => g.Max(x => x.SequenceNo));
编辑:了解客户:
var m = x.GroupBy(r => r.ClientNo).Select(g => new { ClientID = g.Key, Max = g.Max(x => x.SequenceNo) });
对于每个“客户机”条目,您希望知道最高顺序。因此,这意味着结果应该是一个序列(每个客户端),而不是Max返回的单个值。那么:
var maxSequence = criticalNotesData
.GroupBy(n => n.ClientNo)
.Select(g => new { Client = g.Key, Max = g.Max(i => i.SequenceNo) } );
foreach ( var entry in maxSequence )
{
Console.WriteLine("Client {0} has max sequence of {1}",
entry.Client, entry.Max);
}
// Looking at your original, you now want only to know the (from the original)
// the entries matching MAX. Since you now know the max per client, a second
// operation is needed.
var maxValueEntries = criticalNotesData
.Where(n => maxSequence
.Single(c => c.Client == n.Client)
.Max == n.SequenceNo));
maxValueEntries
正在进行大量查找,因此值字典可能更好
// Turning the original into a Dictionary of clientNo returning the
// max sequence.
var maxSequence2 = criticalNotesData
.GroupBy(n => n.ClientNo)
.Select(g => new { Client = g.Key, Max = g.Max(i => i.SequenceNo) } )
.ToDictionary(c => c.Client, c => c.Max);
var maxValueEntries2 = criticalNotesData
.Where(n => maxSequence2[n.Client] == n.SequenceNo));
对于每个“客户机”条目,您希望知道最高顺序。因此,这意味着结果应该是一个序列(每个客户端),而不是Max返回的单个值。那么:
var maxSequence = criticalNotesData
.GroupBy(n => n.ClientNo)
.Select(g => new { Client = g.Key, Max = g.Max(i => i.SequenceNo) } );
foreach ( var entry in maxSequence )
{
Console.WriteLine("Client {0} has max sequence of {1}",
entry.Client, entry.Max);
}
// Looking at your original, you now want only to know the (from the original)
// the entries matching MAX. Since you now know the max per client, a second
// operation is needed.
var maxValueEntries = criticalNotesData
.Where(n => maxSequence
.Single(c => c.Client == n.Client)
.Max == n.SequenceNo));
maxValueEntries
正在进行大量查找,因此值字典可能更好
// Turning the original into a Dictionary of clientNo returning the
// max sequence.
var maxSequence2 = criticalNotesData
.GroupBy(n => n.ClientNo)
.Select(g => new { Client = g.Key, Max = g.Max(i => i.SequenceNo) } )
.ToDictionary(c => c.Client, c => c.Max);
var maxValueEntries2 = criticalNotesData
.Where(n => maxSequence2[n.Client] == n.SequenceNo));
您可以使用以下查询根据您的条件获取类对象的列表
var query = (from t in list
group t by t.CliNo into tgroup
select new ClientSequence
{
CliNo = tgroup.Key,
seq = tgroup.Max(r => r.seq)
}).ToList();
假设您的类结构为:
class ClientSequence
{
public string CliNo { get; set; }
public int seq { get; set; }
}
你的名单是:
List<ClientSequence> list = new List<ClientSequence>
{
new ClientSequence{ CliNo= "0000001", seq= 1},
new ClientSequence{ CliNo= "0000001", seq= 2},
new ClientSequence{ CliNo= "0000001", seq= 3},
new ClientSequence{ CliNo= "0000002", seq= 1},
new ClientSequence{ CliNo= "0000002", seq= 1},
new ClientSequence{ CliNo= "0000002", seq= 1},
new ClientSequence{ CliNo= "0000002", seq= 2},
new ClientSequence{ CliNo= "0000002", seq= 2},
};
它会打印出来
Client No.: 0000001 Max Sequence No.: 3
Client No.: 0000002 Max Sequence No.: 2
您可以使用以下查询根据您的条件获取类对象的列表
var query = (from t in list
group t by t.CliNo into tgroup
select new ClientSequence
{
CliNo = tgroup.Key,
seq = tgroup.Max(r => r.seq)
}).ToList();
假设您的类结构为:
class ClientSequence
{
public string CliNo { get; set; }
public int seq { get; set; }
}
你的名单是:
List<ClientSequence> list = new List<ClientSequence>
{
new ClientSequence{ CliNo= "0000001", seq= 1},
new ClientSequence{ CliNo= "0000001", seq= 2},
new ClientSequence{ CliNo= "0000001", seq= 3},
new ClientSequence{ CliNo= "0000002", seq= 1},
new ClientSequence{ CliNo= "0000002", seq= 1},
new ClientSequence{ CliNo= "0000002", seq= 1},
new ClientSequence{ CliNo= "0000002", seq= 2},
new ClientSequence{ CliNo= "0000002", seq= 2},
};
它会打印出来
Client No.: 0000001 Max Sequence No.: 3
Client No.: 0000002 Max Sequence No.: 2
使用GroupBy
两次,然后使用OrderByDescending
首先获取
,而不是使用Max
,这样,您就不需要创建新对象,仍然可以获取重复的Max项
结果将完全符合您的要求:
Cli No: 0000001, seq: 3
Cli No: 0000001, seq: 3
Cli No: 0000002, seq: 2
Cli No: 0000002, seq: 2
使用GroupBy
两次,然后使用OrderByDescending
首先获取
,而不是使用Max
,这样,您就不需要创建新对象,仍然可以获取重复的Max项
结果将完全符合您的要求:
Cli No: 0000001, seq: 3
Cli No: 0000001, seq: 3
Cli No: 0000002, seq: 2
Cli No: 0000002, seq: 2
假设数据如下:
var list = new []
{
new { CliNo= "0000001", SeqNo= 1 },
new { CliNo= "0000001", SeqNo= 2 },
new { CliNo= "0000002", SeqNo= 1 },
new { CliNo= "0000001", SeqNo= 3 },
new { CliNo= "0000001", SeqNo= 3 },
new { CliNo= "0000002", SeqNo= 1 },
new { CliNo= "0000002", SeqNo= 1 },
new { CliNo= "0000002", SeqNo= 2 },
new { CliNo= "0000002", SeqNo= 2 },
};
您可以使用以下选项:
var output =
from i in list
orderby i.CliNo, i.SeqNo
group i by i.CliNo into g
let max = g.Max(x => x.SeqNo)
from r in g where r.SeqNo == max
select r;
我在评论中所说的仍然有效,数据的初始顺序很重要,在这段代码中,我采用了一种通用的方法,但是如果您对初始顺序有保证,那么如果您的数据源很昂贵,那么还有其他更有效的策略。假设数据如下:
var list = new []
{
new { CliNo= "0000001", SeqNo= 1 },
new { CliNo= "0000001", SeqNo= 2 },
new { CliNo= "0000002", SeqNo= 1 },
new { CliNo= "0000001", SeqNo= 3 },
new { CliNo= "0000001", SeqNo= 3 },
new { CliNo= "0000002", SeqNo= 1 },
new { CliNo= "0000002", SeqNo= 1 },
new { CliNo= "0000002", SeqNo= 2 },
new { CliNo= "0000002", SeqNo= 2 },
};
您可以使用以下选项:
var output =
from i in list
orderby i.CliNo, i.SeqNo
group i by i.CliNo into g
let max = g.Max(x => x.SeqNo)
from r in g where r.SeqNo == max
select r;
我在评论中说的仍然有效,数据的初始顺序很重要,在这段代码中,我采用了一种通用的方法,但是如果您对初始顺序有保证,那么如果您的数据源很昂贵,那么还有其他更有效的策略。如何处理重复的客户编号?您想要的输出背后的逻辑是什么?为什么需要重复的条目?序列的每一行都有一个名为“line no”的字段和另一个名为“text”的字段。所以我需要最高的序列号,然后合并所有附加到该序列的文本行,但我可以做到这一点,只需要获得每个客户编号的最高序列。是否保证条目已经由CliNo和SeqNo排序?这会在处理它们的方式上产生很大的不同,特别是如果数据来自“昂贵”的资源。执行缓冲的Linq操作可能会影响性能,如果项目很多,也会影响内存。重复的客户端号有什么关系?您想要的输出背后的逻辑是什么?为什么需要重复的条目?序列的每一行都有一个名为“line no”的字段和另一个名为“text”的字段。所以我需要最高的序列号,然后合并所有附加到该序列的文本行,但我可以做到这一点,只需要获得每个客户编号的最高序列。是否保证条目已经由CliNo和SeqNo排序?这会在处理它们的方式上产生很大的不同,特别是如果数据来自“昂贵”的资源。执行缓冲的Linq操作可能会影响性能,如果项目很多,也会影响内存。您不知道在枚举
m
时它指的是哪个客户端。在枚举m
时它指的是哪个客户端。您好,谢谢,如果我的类结构是公共类KNOWTXTS:ExcelReport呢{public String ClientNo{get;set;}public String Text type{get;set;}public String SequenceNo{get;set;}public String LineNo{get;set;}public String Text{get;set;}我还需要将其他字段添加到查询中?@DavidJohnson,只有当您返回类对象的列表时,否则您可以返回任何匿名对象并使用它。我需要在新列表中导出该类中的另一个字段,但我无法确定如何获取它?当我添加“LineNo”时=g.我没有得到列表中所有字段的列表?@DavidJohnson,很抱歉我之前的评论,您不能这样做,您希望该字段如何附加到任何特定行?如果您希望基于多个列进行分组,您可能会看到此线程喂,谢谢,如果我的类结构是公共类KNOWTXTS:ExcelReport怎么办{public String ClientNo{get;set;}public String TextType{