假设我有 3 个整数数组,它们是 arr1、arr2 和 prod。其中,Arr1 和 Arr2 具有相同的长度,而 prod 将取决于大小。我正在尝试以下代码
for (int i =0; i < arr1.lenght; i++)
{
if (arr1[i]> 0 && arr2[i]> 0)
prod[i]= arr1[i]*arr2[i];
}
我怎样才能提前重新调整阵列 prod 的大小?请问有什么帮助吗?非常感谢。
使用集合。例如列表
List<int> prod = new List<int>();
for (int i =0; i < arr1.lenght; i++)
{
if (arr1[i]> 0 && arr2[i]> 0)
prod.Add(arr1[i]*arr2[i]);
}
然后您可以从 List 创建一个数组:
int[] prodArray = prod.ToArray();
如果要保持 arr1 中的索引和乘法结果中的索引之间的连接,可以使用Dictionary
Dictionary<int, int> prod = new Dictionary<int, int>();
for (int i =0; i < arr1.lenght; i++)
{
if (arr1[i]> 0 && arr2[i]> 0)
prod.Add(i, arr1[i]*arr2[i]);
}
您可以使用 LINQ:
int[] prod = arr1
.Zip(arr2, (i, j) => Tuple.Create(i, j))
.Where(t => t.Item1 > 0 && t.Item2 > 0)
.Select(t => t.Item1 * t.Item2)
.ToArray();
这将仅包含相应元素为arr1
和arr2
为正的产品。
编辑:稍微好一点的方法是:
int[] prod = Enumerable.Range(0, arr1.Length)
.Where(i => arr1[i] > 0 && arr2[i] > 0)
.Select(i => arr1[i] * arr2[i])
.ToArray();
这避免了创建中间元组。
一种选择是使用List<int>
. 这将根据添加的内容动态调整大小。插入的性能会比使用 a 慢,int[]
但取决于大小,它可能是微不足道的。
所以你可以这样做:
List<int> Prod = new List<int>();
for (int i =0; i < arr1.lenght; i++)
if (arr1[i]> 0 && arr2[i]> 0)
prod.Add(arr1[i]*arr2[i]);
我希望这有帮助。
这是另一种方法:
static void Main(string[] args)
{
List<int> arr1 = new List<int>();
List<int> arr2 = new List<int>();
List<int> prod = new List<int>();
arr1.AddRange(new int[] { 1, 0, 1 });
arr2.AddRange(new int[] { 1, 1, 0 });
prod = arr1.Select((item, index) => new { item, index })
.Join(arr2.Select((item, index) => new { item, index }), i => i.index, i => i.index, (a, b) => a.item * b.item)
//Where makes it variable
.Where(i => i > 0)
.ToList();
}
您可以使用以下 LINQ:
int[] prod = (from x in Enumerable.Range(0, array1.Length).Select((z) => array1[z] * array2[z]) where x != 0 select x).ToArray();
这利用了一个事实,即0
如果因子之一也是 0,则只能是乘法的结果。
编辑
我错过了你的问题。您想将两个因素都为正的条目相乘。在这种情况下,您应该使用@Lee 提供的 LINQ 代码。
编辑 2
我刚刚阅读了您对建议使用字典的答案的评论,以便您稍后可以查看哪个索引产生了哪个结果:
您所说的“保持连接”是什么意思。我认为使用 list 和 dictionary 保持相同的索引。我对吗 ?
此处给出的所有解决方案都会生成元素数量少于或等于arr1
和的列表或数组arr2
。这意味着在最坏的情况下,您不知道哪个索引产生了乘法结果。
您原始答案中的代码围绕这一点发布:prod
数组需要具有与 and 相同数量的元素arr1
,arr2
否则您会遇到异常。
In turn, elements that are 0
in the prod
array can only be the result of one of arr1
or arr2
being <= 0
at this index. This is information you lose when creating a list - thus the suggestion of using a dictionary, which maps the index to the result, but still contains less elements.