c# - Linq 按属性将对象划分为多个对象
问题描述
我只是想知道是否有一种方法可以使用 C# LINQ 基于对象属性将列表项拆分为两个列表项。
例如:
{
"ItemName": "Test Item",
"SubItemName": [
{
"Sub-Item-1",
"Sub-Item-2",
}
]
}
如何通过 subItemName 拆分此对象,例如:
{
"ItemName": "Test Item Name",
"SubItemName": "Sub-Item-1"
},
{
"ItemName": "Test Item Name",
"SubItemName": "Sub-Item-2",
}
解决方案
是的,就是SelectMany
。让我们看一个简单的例子:
class C
{
public string Name { get; set; }
public IEnumerable<string> Subs { get; set; }
}
现在让我们制作一堆。
var cs = new List<C> {
new C { Name = "Alice", Subs = new List<string> { "Orange", "Green" }},
new C { Name = "Bobby", Subs = new List<string> { "Red", "Blue" }}
}
也就是说,我们有
Alice
Orange
Green
Bobby
Red
Blue
你想要一个新的列表
Alice
Orange
Alice
Green
Bobby
Red
Bobby
Blue
正确的?
任何时候您想“展平”您使用 SelectMany 的列表列表。无论是理解形式:
var query =
from c in cs
from s in c.Subs
select new C { Name = c.Name, Subs = new List<string> { s } };
或以流利的形式
var query =
cs.SelectMany(
c => c.Subs,
(c, s) => new C { Name = c.Name, Subs = new List<string> { s } });
如您所见,它具有相同的结构,只是更难阅读。
如果您需要另一端的列表:
var newList = query.ToList();
你完成了。
推荐阅读
- apache-spark - 使用 SparkSession 创建一个具有指定架构的空 DataFrame 而不使用 SparkContext
- java - 从xml读取和解析汉字
- php - 嵌套的 php 包含文件 - 不显示内容 Wordpress
- java - Java - 通过扫描器输入的子字符串来接收相应的信息
- html - 颜色未显示在打印预览中,但显示在简单视图中
- python-3.x - 使一个线程依赖于另一个线程的 isAlive()
- java - 如何实现记住我功能的自动化测试用例
- python - 使用 Python 将列表写入 CSV 文件中的列
- python - python LightGBM 文本分类与 Tfidf
- ruby-on-rails - Ruby on Rails 更新 10 万条记录的最佳方式