gpt4 book ai didi

c# - 在了解每个 Select/SelectMany 结果的同时转换 Linq 中的序列

转载 作者:太空宇宙 更新时间:2023-11-03 21:40:56 26 4
gpt4 key购买 nike

这是我的问题。我有一个特定的列表,我将其显示为 int[]为简单起见。

int[] a = {1,2,3,4,5};

假设我需要转换这个列表中的每一项,但根据情况,我可能会返回一个 int 或一个 int 数组。

例如,假设我需要返回 {v}如果值为奇数,并且{v,v+1}如果值为偶数。我已经这样做了:

int[] b = a.SelectMany(v => v % 2 == 0 ? new int[] { v, v+1 } : new int[] { v })
.ToArray();

所以如果我运行它,我会得到预期的响应:

{1,2,3,3,4,5,5}

看到我有重复的数字,对吧? 35 .我不想要那些重复的数字。现在,你可能会告诉我,我可以调用 .Distinct()处理数组后。

这就是问题所在。 SelectMany子句相当复杂(我只是编了一个更简单的例子),我绝对不想处理 3如果它已经存在于列表中。

我可以检查 3存在于原始列表中。但是如果我得到 3SelectMany条款,我不想再得到它。例如,如果我有这个列表:

int[] a = {1,2,3,4,5,2};

我会得到这个:

{1,2,3,3,4,5,5,2,3}

从而返回v (我的原始值)和 v+1再次在最后。只是为了让你更好地理解它v+1代表一些我想避免的处理。

总结一下,这就是我想要的:

  1. 我有一个对象列表。 (检查)
  2. 我需要过滤它们,根据结果,我可能需要返回多个对象。 (检查,用过 SelectMany )
  3. 我需要它们与众不同,但我无法在流程结束时做到这一点。我应该只能返回 {v}如果{v+1}已经存在。 (无知...)

我想到的一件事是编写自定义 SelectMany这可能适合我的需要,但我想确保没有内置的方法来执行此操作。

编辑:我相信我的例子可能误导了你们。我知道如何计算 v+1在列表中。明确地说,我有一个对象具有 2 个 int 属性,Id 和 IdParent。我需要“ yield 返回”所有对象他们的 parent 。但我只有 ParentId,它来自对象本身。我能知道 v+1在列表中,因为我可以检查那里是否有任何对象具有与我正在检查的 ParentId 相同的 Id。

回答:我最终使用了 Aggregate ,它可以用来做我正在寻找的东西。

最佳答案

这个简单的循环是否与HashSet<int>帮助?

int[] a = {1,2,3,4,5,2};
var aLookupList = new HashSet<int>();
foreach (int i in a)
{
bool isEven = i % 2 == 0;
if (isEven)
{
aLookupList.Add(i);
aLookupList.Add(i + 1);
}
else
{
aLookupList.Add(i);
}
}
var result = aLookupList.ToArray();

关于c# - 在了解每个 Select/SelectMany 结果的同时转换 Linq 中的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19320491/

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