Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取每个项目的最大值通用列表_C#_Linq - Fatal编程技术网

C# 获取每个项目的最大值通用列表

C# 获取每个项目的最大值通用列表,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,序号:1
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{