gpt4 book ai didi

linq - 如何查询数据列表以将行变成列

转载 作者:行者123 更新时间:2023-12-04 20:09:24 25 4
gpt4 key购买 nike

我有一个如下所示的数据列表

Item    Vendor  Compliance  Status

I1 V1 C1 Y
I1 V1 C2 N
I1 V1 C3 Y
I1 V2 C1 Y
I1 V2 C2 Y
I2 V1 C3 Y

我如何查询以使其成为
Item    Vendor  C1  C2  C3

I1 V1 Y N Y
I1 V2 Y Y -
I2 V1 - - Y

虽然合规可能有很多,但不一定只有C1、C2、C3。

最佳答案

我将欺骗@Serv 并使用他用于定义数据的一部分代码(叹气 - 是的,我很懒)。

处理dynamic您可以使用的许多合规性方面 ExpandoObject .您需要做的就是获取所有现有的合规性类型,并为每种类型为您的对象分配一个属性。

void Main()
{
var content = new List<Content>()
{
new Content("I1", "V1", "C1", true),
new Content("I1", "V1", "C2", false),
new Content("I1", "V1", "C3", true),
new Content("I1", "V2", "C1", true),
new Content("I1", "V2", "C2", true),
new Content("I2", "V1", "C3", true),
new Content("I2", "V1", "C4", true)
};

var compliances = content.Select(c=>c.Compliance).Distinct();
var temp = content.GroupBy (c => new {Item = c.Item, Vendor = c.Vendor});
var results = temp.Select (t =>
{
dynamic result = new ExpandoObject();
result.Item = t.Key.Item;
result.Vendor = t.Key.Vendor;
foreach(var compliance in compliances)
{
var isCompliant = t.Any(x => x.Compliance == compliance && x.Status.GetValueOrDefault());
((IDictionary<String, Object>)result).Add(compliance, isCompliant);
}
return result;
}).Dump();
}

public class Content
{
public Content(string item, string vendor, string compliance, bool? status)
{
Item = item; Vendor = vendor; Compliance = compliance; Status = status;
}

public string Item { get; set; }
public string Vendor { get; set; }
public string Compliance { get; set; }
public bool? Status { get; set; }
}

结果:

Results

编辑

获取 null而不是 false如果不存在合规性,请使用此代码 foreach环形:
var isCompliant = t.FirstOrDefault(x => x.Compliance == compliance); 
((IDictionary<String, Object>)result).Add(compliance, isCompliant == null ? null : isCompliant.Status);

结果将如下所示:

Results after edit.

关于linq - 如何查询数据列表以将行变成列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20627054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com