如何解决Linq从同一对象中选择并添加多个值
假设我有一个带有两个数值属性的类,并创建了一堆数值属性。
public class TwoNumbers
{
public TwoNumbers(int first,int second)
{
First = first;
Second = second;
}
public int First { get; set; }
public int Second { get; set; }
}
是否可以使用LINQ或lambda查询将每个对象的First
和Second
都添加到整数列表中?例如:
List<TwoNumbers> twoNumbersList = new List<TwoNumbers>()
{
new TwoNumbers(1,1),new TwoNumbers(32,59),new TwoNumbers(-12,200),}
// Can I populate a list of integers upon assignment with a LINQ or lambda query?
List<int> integersVerbose = new List<int>()
foreach (var tn in twoNumbersList)
{
integersVerbose .Add(tn.First);
integersVerbose .Add(tn.Second);
}
// Desired syntax
var integersConcise = twoNumbersList. /* some expression */ .ToList(); // Automatically infers type from query
// Print the numbers
integersVerbose.Foreach(x => Console.WriteLine(x));
integersConcise.Foreach(x => Console.WriteLine(x));
// Expected output:
// 1
// 1
// 32
// 59
// -12
// 200
// 1
// 1
// 32
// 59
// -12
// 200
我知道这里有一个SelectMany
方法,但是在这里似乎没有用,因为我不是想从一个对象中提取一个集合,我只是想一个带有数字的平面列表。
解决方法
您可以像这样使用SelectMany
:
var integersConcise = twoNumbersList.SelectMany(x => new[] { x.First,x.Second });
为避免数组分配,您可以在IEnumerable
类上创建TwoNumbers
属性:
public class TwoNumbers
{
//...
public IEnumerable<int> Both { get { yield return First; yield return Second; } }
}
var integersConcise = twoNumbersList.SelectMany(x => x.Both);
甚至实现IEnumerable<int>
:
public class TwoNumbers : IEnumerable<int>
{
//...
public IEnumerator<int> GetEnumerator()
{
yield return First;
yield return Second;
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
var integersConcise = twoNumbersList.SelectMany(x => x);
,
如果将两个数字投影到集合中,则可以使用SelectMany
:
List<TwoNumbers> twoNumbersList = new List<TwoNumbers> {
new TwoNumbers(1,1),new TwoNumbers(32,59),new TwoNumbers(-12,200),};
var results = twoNumbersList.SelectMany(nl => new[] { nl.First,nl.Second });
输出:
,1
1
32
59
-12
200
尝试GroupBy
List<int> inputs = new List<int> { 0,1,2,3,4,5,6,7,8,9 };
List<List<int>> outputs = inputs
.Select((x,i) => new { x = x,i = i })
.GroupBy(x => x.i / 2)
.Select(x => new List<int>() {x.First().x,x.Last().x})
.ToList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。