1

这是我的问题。我有一个特定的列表,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。我需要“归还”所有对象及其父母。但我只有 ParentId,它来自对象本身。我能够知道是否v+1在列表中,因为我可以检查那里是否有任何对象具有与我正在检查的 ParentId 相同的 ID。

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

4

4 回答 4

3

这个简单的循环是否有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();
于 2013-10-11T14:32:23.000 回答
1

这个使用Aggregate方法怎么样。您将不会处理已经在列表中的数字,无论它们是在原始列表中还是由于应用 (v + 1)

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

 var result = v.Aggregate(new List<int>(),
   (acc, next) =>
   {
     if (!acc.Contains(next))
       return (next % 2 == 0) ? acc.Concat(new int[] { next, next + 1 }).ToList()
                              : acc.Concat(new int[] { next }).ToList();
     else
       return acc;
   }).ToArray();
于 2013-10-11T15:15:24.693 回答
0

As I understand you have this input:

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

And the output should also be {1,2,3,4,5} because you don't want duplicated numbers as you describe. Because you use an array as input, you can try this code:

var output = a.SelectMany((x,i)=> x % 2 == 0 ? new []{x,x+1} : 
                                  i > 0 && a[i-1]==x-1 ? new int[]{} : new []{x});
//if the input is {1,2,4,5}
//The output is also {1,2,3,4,5}
于 2013-10-11T14:39:47.947 回答
0
var existing = new HashSet<int>(a);

var result = existing
    .Where(v => v % 2 == 0 && !existing.Contains(v + 1))
    .Select(v => v + 1)
    .Concat(existing)
    .ToArray();
于 2013-10-11T14:28:12.127 回答