1

arr1、arr2、および prod の 3 つの整数配列があるとします。ここで、Arr1 と Arr2 は同じ長さですが、prod はサイズによって異なります。そして、私は次のコードを試しています

for (int i =0; i < arr1.lenght; i++)
{        
    if (arr1[i]> 0 && arr2[i]> 0)
        prod[i]= arr1[i]*arr2[i];
}

事前に配列製品のサイズを変更するにはどうすればよいですか? 助けてください。どうもありがとう。

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]);
}

次に、リストから配列を作成できます。

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();

arr1これには、との対応する要素arr2が正の製品のみが含まれます。

編集:少し良い方法は次のとおりです。

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

1つのオプションは、を使用することList<int>です。これにより、追加された内容に基づいて動的にサイズが変更されます。挿入のパフォーマンスはそれよりも遅くなりますが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これは、係数の 1 つが 0 の場合にのみ乗算の結果になり得るという事実を利用しています。

編集
私はあなたの質問で少し逃しました。両方の要素がのエントリを乗算します。その場合、@Lee が提供した LINQ コードを使用する必要があります。

EDIT 2
辞書を使用することを提案した回答に対するあなたのコメントを読んだので、後でどのインデックスがどの結果を生成したかを確認できます。

「接続を維持する」とはどういう意味ですか。リストと辞書の両方を使用すると、同じインデックスが保持されると思います。私は正しいですか?

arr1ここで与えられたすべてのソリューションは、およびより少ないか等しい数の要素を持つリストまたは配列を生成しますarr2。これは、最悪の場合、どのインデックスが乗算の結果を生成したかがわからないことを意味します。

元の回答のコードは次のように出荷されます。配列には、 and とprod同じ数の要素が必要です。そうしないと、例外が発生します。arr1arr2

0同様に、配列内の要素は、このインデックスのいずれかまたはprodその位置にあることの結果でしかありません。これは、リストを作成するときに失われる情報です。したがって、辞書を使用することをお勧めします。辞書を使用すると、インデックスが結果にマップされますが、含まれる要素は少なくなります。arr1arr2<= 0

于 2012-12-06T09:39:08.537 に答える