4

私は初心者です。C# 4.0 で IP 範囲を取得するプログラムを作成します。小さな範囲ではうまく機能しますが、クラス A の IP アドレスのような範囲を取得すると、プログラムに多くの時間がかかります。助けが必要です。コード(良いアプローチではありません)。より良い方法で書くための提案はありますか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ipSplitt
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            string[] z = new string[4];
            int t = 0;
            string ip = "3.0.0.0";

            string[] Ip = ip.Split(new char[] { '.' });

            foreach (string m in Ip)
            {
                z[t] = m;
                t++;
            } 

            int a1, b1, c1, d1 = 0;

            a1 = Convert.ToInt32(z[0]);
            b1 = Convert.ToInt32(z[1]);
            c1 = Convert.ToInt32(z[2]);
            d1 = Convert.ToInt32(z[3]);

            string[] v = new string[4];
            string ip2 = "3.255.255.255";
            int l = 0;
            string[] Ip2 = ip2.Split(new char[] { '.' });

            foreach (string m in Ip2)
            {
                v[l] = m;
                l++;
            } 

            int a2, b2, c2, d2 = 0;

            a2 = Convert.ToInt32(v[0]);
            b2 = Convert.ToInt32(v[1]);
            c2 = Convert.ToInt32(v[2]);
            d2 = Convert.ToInt32(v[3]);

            while (d2 >= d1 || c2 > c1 || b2 > b1 || a2 > a1)
            {
                if (d1 > 255)
                {
                    d1 = 1;
                    c1++;
                }

                if (c1 > 255)
                {
                    c1 = 1;
                    b1++;
                }

                if (b1 > 255)
                {
                    b1 = 1;
                    a1++;
                }

                using (StreamWriter writer = new StreamWriter("import.txt",true))
                    writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

                d1++;
            }
        }
    }
}
4

7 に答える 7

5

しかし、クラス A の IP アドレスのような範囲を指定すると、プログラムに多くの時間がかかります

ファイルハンドルを 255^3 回開閉しているためです。using(Streamwriter ...)外側の while ループの周りにブロックを配置します。

于 2012-04-27T08:07:47.710 に答える
1

.NET フレームワークのIPAddress クラスと、静的な Parse関数を見てください。

于 2012-04-27T08:06:22.910 に答える
1

多くの時間がこれに行きます

using (StreamWriter writer = new StreamWriter("import.txt",true))
                writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

だからあなたはこれをするべきです

        StringBuilder sb = new StringBuilder(Int32.MaxValue);
        sb.Append(a1.ToString() + "." + b1.ToString() + "." + c1.ToString() + "." + d1.ToString() + "\n");

そして結局電話するだけ

        File.WriteAllLines("import.txt", sb.ToString().Split('\n'));
于 2012-04-27T08:10:13.533 に答える
1

StringBuilder ソリューションは私のシステムでメモリ不足の例外をスローするため、単純に追加する必要があります

 StreamWriter writer = new StreamWriter("import.txt");

関数の上に置き、次に置き換えます

 using (StreamWriter writer = new StreamWriter("import.txt",true))
            writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

そして追加

writer.Close();

底に。10秒で完了します。

于 2012-04-27T08:21:19.023 に答える
1

あなたのアプローチは簡単で、ここにすでに良い答えがあります。しかし... IPアドレスとは何ですか?4バイトの整数ですよね?したがって、範囲制限を int32 として解析し、マスクを使用して出力ストリームに数値を出力して 10 進数表現を取得しない理由は次のとおりです。

127.0.0.1 = 01111111 00000000 00000000 00000001
a = ip & 0xFF000000
b = ip & 0x00FF0000 
c = ip & 0x0000FF00
d = ip & 0x000000FF

ただし、ストリームをループ外で初期化することを忘れないでください。

于 2012-04-27T08:25:07.253 に答える
0

毎回ファイルを開くので、IPごとにフラッシュされます。while ブロックの周りに using ステートメントを配置します。

于 2012-04-27T08:07:43.880 に答える
0

ファイル import.txt に書き込むステートメントが、ループの速度を低下させる主な原因です。ips.AppendLine(a1 + "." + b1 + "." + c1 + "." + d1); StreamWriter コードをHere, ips is a StringBuilder object に置き換える必要があると思います 。ループの外側に、次のコードを書きました。

StreamWriter writer = new StreamWriter("import.txt", false))
char[]  arr ;

arr = new char[ips.Length]  ;
ips.CopyTo(0, arr, 0, ips.Length) ;

writer.Write(arr);
writer.Dispose()

ここでは、StringBuilder から import.txt に文字列をダンプしません。しかし、私は char[] にコピーしてからダンプします。これははるかに高速であることを確認しました。これが役立つことを願っています!!

于 2012-04-27T09:06:27.027 に答える