1

假设我有 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 的大小?请问有什么帮助吗?非常感谢。

4

5 回答 5

4

使用集合。例如列表

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]);
}
于 2012-12-06T09:27:50.953 回答
3

您可以使用 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();

这将仅包含相应元素为arr1arr2为正的产品。

编辑:稍微好一点的方法是:

int[] prod = Enumerable.Range(0, arr1.Length)
    .Where(i => arr1[i] > 0 && arr2[i] > 0)
    .Select(i => arr1[i] * arr2[i])
    .ToArray();

这避免了创建中间元组。

于 2012-12-06T09:32:05.647 回答
1

一种选择是使用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]);

我希望这有帮助。

于 2012-12-06T09:28:04.673 回答
1

这是另一种方法:

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();
}
于 2012-12-06T09:38:02.340 回答
1

您可以使用以下 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 相同数量的元素arr1arr2否则您会遇到异常。

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.

于 2012-12-06T09:39:08.537 回答