Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ从3个数组中创建一个合并的数组,LINQ不是压缩的,而是基于内容相等的_C#_Linq - Fatal编程技术网

C# 如何使用LINQ从3个数组中创建一个合并的数组,LINQ不是压缩的,而是基于内容相等的

C# 如何使用LINQ从3个数组中创建一个合并的数组,LINQ不是压缩的,而是基于内容相等的,c#,linq,C#,Linq,我有三个数组,它们应该通过Linq合并成一个结果: int?[] list1 = {0,1,2,3,4}; int?[] list2 = {2,3,4,5}; int?[] list3 = {3,4}; 结果: var result= { (0,null,null), (1,null,null), (2,2,null), (3,3,3), (4,4,4), (null,5,null) } 首先将所有阵列放在一个阵列中: var lists =

我有三个数组,它们应该通过Linq合并成一个结果:

int?[] list1 = {0,1,2,3,4};
int?[] list2 = {2,3,4,5};
int?[] list3 = {3,4};
结果:

var result=
{
    (0,null,null),
    (1,null,null),
    (2,2,null),
    (3,3,3),
    (4,4,4),
    (null,5,null)
}

首先将所有阵列放在一个阵列中:

var lists = new[] { list1, list2, list3 };
现在循环所有可能的数字,并检查它们是否包含在适当的数组中。如果是,您可以将该数字添加到结果中,否则添加
null

var result = new List<List<int?>>();
for(int i = 0; i < 6; i++)
{
    result.Add(new List<int?>());
    for(int j = 0; j < 3; j++)
    {
        if(lists[j].Contains(i))
            result[i].Add(i);
        else
            result[i].Add(null);
    }
}
var result=newlist();
对于(int i=0;i<6;i++)
{
结果.添加(新列表());
对于(int j=0;j<3;j++)
{
if(列出[j]。包含(i))
结果[i]。添加(i);
其他的
结果[i]。添加(空);
}
}

我想这很简单。这样做只会使事情过于复杂,看起来很难看,很难调试和理解。我怀疑这样做是不是一个好主意。

让我们从用更通用的术语定义输入开始:整数列表。因为我们不需要修改这些集合,所以我们将使用最简单的接口,
IEnumerable
。这意味着我们的输入将是:
IEnumerable
。我们的产量将是一样的

现在,让我们为完成这项工作的方法定义一个原型:

public static IEnumerable<IEnumerable<int?>> Merge(IEnumerable<IEnumerable<int?>> source) { //... }
现在让我们从实现开始,首先我们需要计算所有列表中的每个不同值:

source.SelectMany(x=>x).Distinct()
现在,对于这些值中的每一个,我们需要返回一个集合,其中原始“超级列表”中的每一项都有一个项:

source.SelectMany(x=>x).Distinct().Select(x=>source.Select(y=> //...
那么,我们需要在最终选择lambda中做什么?我们将x作为每个不同的整数(或者从技术上讲是
T
),y作为每个原始集合。如果y集合包含x,则需要值x,否则为null(或者也允许值类型,默认值(T))。我们可以使用三元:

source.SelectMany(x=>x).Distinct().Select(x=>source.Select(y=>y.Contains(x)?x:default(T)));
总而言之:

public static IEnumerable<IEnumerable<T>> Merge<T>(this IEnumerable<IEnumerable<T>> source) 
{
    return source
        .SelectMany(x=>x)
        .Distinct()
        .Select(x=>source
            .Select(y=>y.Contains(x)?x:default(T)));
}

你的问题是什么?你尝试了什么?我们没有做你的工作。不管怎样,很难理解背后的逻辑。列表应该如何合并?问题是我不知道如何开始。我只需要一个快速提示,我可以使用哪种方法/Linq语句use@rudimenter:首先解释您的逻辑并修复不必要的编译错误r示例列表因此,您应该明确拥有一些用于实际逻辑的工作代码。然后尝试使用linq。当您甚至不知道要查询什么时,不要通过学习复杂的linq内容来使事情过于复杂(这就是linq中的q所代表的)。请看一些linq示例和文档。@rudimenter:linq不是最好的工具,如果你必须创建锯齿状数组,这里就是这种情况。通常循环更快,更容易阅读。
public static IEnumerable<IEnumerable<T>> Merge<T>(this IEnumerable<IEnumerable<T>> source) 
{
    return source
        .SelectMany(x=>x)
        .Distinct()
        .Select(x=>source
            .Select(y=>y.Contains(x)?x:default(T)));
}
int?[] list1 = {0,1,2,3,4};
int?[] list2 = {2,3,4,5};
int?[] list3 = {3,4};
var result = new []{ list1, list2, list3 }.Merge();

Console.WriteLine(string.Join(Environment.NewLine, result.Select(t=>string.Join(",", t))));