将项目分组到数组列表的最简单方法

时间:2019-05-14 14:10:07

标签: c# linq

我正在尝试从另一个API获得响应,然后将匹配的值进行分组,以在匹配时将其发送到另一个API中。我认为一种方法是通过对每个项目进行一次foreach来重建整个对象,但是我正在寻找一种更简单的方法(可能通过Linq?)来对这些数据进行分组。

为了便于阅读,在JSON中显示示例,最终将是c#对象

输入:

[{
    "itemID": 123,
    "orderedItemID": 1,
    "queuePosition": 1
},
{
    "itemID": 123,
    "orderedItemID": 2,
    "queuePosition": 3
},
{
    "itemID": 123,
    "orderedItemID": 3,
    "queuePosition": 5
},
{
    "itemID": 456,
    "orderedItemID": 10,
    "queuePosition": 1
},
{
    "itemID": 456,
    "orderedItemID": 14,
    "queuePosition": 2
}]

所需的输出

[{
    "itemID": 123,
    "queuePosition": [1,3,5]
},
{
    "itemID": 456,
    "queuePosition": [1,2]
}]

有关输出类的更多信息:

[DataContract]
public sealed class QueuePosition
{
[DataMember(Name = "itemID")]
public int ItemID { get; set;}

[DataMember(Name = "queuePosition")]
public IEnumerable<int> QueuePosition { get; set;}
}

3 个答案:

答案 0 :(得分:1)

尝试GroupBy;如果您有对象的集合,请说一个数组:

var source = new MyObject[] {
  new MyObject(itemID : 123, orderedItemID :  1, queuePosition : 1),
  ...
  new MyObject(itemID : 456, orderedItemID : 14, queuePosition : 2), 
};

代码可以是

QueuePosition[] result = source
  .GroupBy(item => item.itemID)
  .Select(group => new QueuePosition() {
     ItemID = group.Key,
     QueuePosition = group
       .Select(item => item.queuePosition)
       .ToArray() 
   })
  .ToArray();

答案 1 :(得分:1)

可以使用Linq如下进行分组,前提是使用了某些实际类型。

col_null_g_75p=list({i for i in aggregated_dict if aggregated_dict[i] > 0.75})
print(col_null_g_75p)
    ['A', 'E']
df = df.drop(*col_null_g_75p)
df.show()
+----+----+----+ 
|   B|   C|   D| 
+----+----+----+ 
|  21|  12|null| 
|null|   3|   1| 
|  40|null|  10| 
|   2|null|   6| 
|   8|   0|   2| 
+----+----+----+

答案 2 :(得分:0)

如果要使用LINQ,必须首先将JSON转换为C#对象。 为此,您可以使用Newtonsoft here

的JsonConvert

此后,您应该看看linq here

的GroupBy