首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有键和不同值计数的组List<Object>

具有键和不同值计数的组List<Object>
EN

Stack Overflow用户
提问于 2022-09-19 08:43:53
回答 2查看 78关注 0票数 0

我试图想出一个解决方案来分组给定的键和值列表。

我需要这样分组: Key > Distinct值> Count。

例如。

代码语言:javascript
复制
XFN99 2 3 <= [CODE] [DISTINCT_VALUE] [OCCURANCE IN LIST]

我有一个返回List<ObjectPart>的方法。这个对象有一个public string codepublic int value

我需要在一个键中得到每个不同值的计数。

示例输入:

代码语言:javascript
复制
XFN999 2
XFN999 2
XFN999 2
XFN999 4
XFN999 8
XFN999 8
XFN999 8
BPN655 1
BPN675 2
BPN655 1

期望产出:

代码语言:javascript
复制
XFN999 2 => 3x
XFN999 4 => 1x
XFN999 8 => 3x
BPN655 1 => 2x
BPN675 2 => 1x

我试图使用LINQ获得成功,但失败了,因为它将每个键的值相加。

代码语言:javascript
复制
var distValsPerKey = S.getAllDiffs()
                      .Result
                      .GroupBy(x => x.code)
                      .Select(x => new { C_ = x.Key, V_ = x.Distinct().Count() });

使用我的解决方案输出:

代码语言:javascript
复制
BPN373 => 30
BPN374 => 35
BPN377 => 47
BPN378 => 43
BPN387 => 67
BPN388 => 49
BPN653 => 10
BPN654 => 15
BPN699 => 40
BPN700 => 45
BPN711 => 68
BPN723 => 13
BPN724 => 11
BPN853 => 5
BPN854 => 6
BPN877 => 99
BPN878 => 94
BPN505 => 92
BPN507 => 570
BPN508 => 617

我的解决方案基本上是对键的值进行求和,但我需要对每个键的不同值进行求和/计数。

例子如下:

获取List<ObjectPart>的输入

代码语言:javascript
复制
public async Task<List<ObjectPart>> getAllDiffs()
{
    List<ObjectPart> TEMP = new List<ObjectPart>();

    await Task.Run(() =>
            {
                using (IngresConnection CONN = new IngresConnection())
                {
                    string QUERY = SELECT_REDACTED;

                    try
                    {
                        using (IngresCommand CMD = new IngresCommand())
                        {

                            CONN.ConnectionString = "host=; userID=; pwd=; database=;";
                            CMD.Connection = CONN;
                            CMD.CommandText = QUERY;
                            CONN.Open();

                            using (IngresDataReader READ = CMD.ExecuteReader())
                            {
                                while (READ.Read())
                                {
                                    ObjectPart OP = new ObjectPart();

                                    OP.wenr = READ.GetValue(0).ToString().Trim();
                                    OP.difference = Convert.ToInt32(READ.GetInt32(1));

                                    TEMP.Add(OP);
                                }
                                READ.Close();
                                CONN.Close();
                            }
                        }
                    }
                    catch (Exception E)
                    {
                        CONN.Close();
                        CONN.Dispose();
                    }
                }
            });

    List<ObjectPart> OPS_SORTED = TEMP.OrderBy(m => m.code).ToList();

    return OPS_SORTED;
}

LINQ输入以获得所需的输出:

代码语言:javascript
复制
 var distValsPerKey = S.getAllDiffs()
                       .Result
                       .GroupBy(x => x.code)
                       .Select(x => new { C_ = x.Key, V_ = x.Distinct().Count() });
        
foreach(var OP in distValsPerKey)
{
    Console.WriteLine($"{OP.C_} = > {OP.V_}");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-19 09:16:57

你想按代码和价值分组,对吧?因此,在您的GroupBy中这样做:

代码语言:javascript
复制
var distValsPerKey = S.getAllDiffs().Result
    .GroupBy(x => new { x.code, x.value })
    .Select(x => new { C_ = x.Key, V_ = x.Distinct().Count() });

您的其余代码应该按原样工作,尽管如果输出GroupBy对象的键,它将不完全符合您所需的格式。我得到的结果如下:

代码语言:javascript
复制
{ code = XFN999, value = 2 } => 3
{ code = XFN999, value = 4 } => 1
{ code = XFN999, value = 8 } => 3
{ code = BPN655, value = 1 } => 2
{ code = BPN675, value = 2 } => 1

如果这不是您想要的,并且希望C_成为示例输出中的文本字符串,那么请更改选择:

代码语言:javascript
复制
var distValsPerKey = S.getAllDiffs().Result
    .GroupBy(x => new { x.code, x.value })
    .Select(x => new { C_ = $"{x.Key.code} {x.Key.value}", 
                       V_ = x.Distinct().Count() });

这就提供了输出:

代码语言:javascript
复制
XFN999 2 => 3
XFN999 4 => 1
XFN999 8 => 3
BPN655 1 => 2
BPN675 2 => 1
票数 -1
EN

Stack Overflow用户

发布于 2022-09-19 10:06:50

鉴于以下投入:

代码语言:javascript
复制
List<(string code, int value)> input = new()
{
    ("XFN999", 2),
    ("XFN999", 2),
    ("XFN999", 2),
    ("XFN999", 4),
    ("XFN999", 8),
    ("XFN999", 8),
    ("XFN999", 8),
    ("BPN655", 1),
    ("BPN675", 2),
    ("BPN655", 1),
};

您可以获得如下所需的输出数据:

代码语言:javascript
复制
List<(string code, int value, int occurrences)> output =
    input
        .GroupBy(x => new { x.code, x.value })
        .Select(x => (x.Key.code, x.Key.value, x.Count()))
        .ToList();

要以您所追求的方式显示这一点,请执行以下操作:

代码语言:javascript
复制
foreach (var o in output)
    Console.WriteLine($"{o.code} {o.value} => {o.occurrences}");

这给了我:

代码语言:javascript
复制
XFN999 2 => 3
XFN999 4 => 1
XFN999 8 => 3
BPN655 1 => 2
BPN675 2 => 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73770718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档