C# 如何使用LINQ从3个数组中创建一个合并的数组,LINQ不是压缩的,而是基于内容相等的
我有三个数组,它们应该通过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 =
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))));