Получение “разности” между двумя массивами в C#?

Дело в том, что вы всегда берете имя файла из первого аргумента:

String fileAddress = args[0];
File fileInput  = new File(fileAddress); //Read

Но в этом случае ваш первый аргумент (например, args[0]) - «--verbose». Таким образом, new File("--verbose") завершается с ошибкой FileNotFoundException, потому что действительно файл "--verbose" не существует в текущем каталоге.

Что вы, вероятно, хотите сделать, это пропустить аргументы, которые начинаются с --, например

int argNum = 0;
while(argNum<args.length && args[argNum].startsWith("--")) {
    argNum++;
}
if(!(argNum < args.length)) {
    throw new IllegalArgumentException("Please pass file path in parameters");
}
String fileAddress = args[argNum];
File fileInput  = new File(fileAddress); //Read
58
задан Michael Myers 25 March 2009 в 20:33
поделиться

3 ответа

Если Вы имеете LINQ доступный Вам, можно использовать Except и Distinct. Наборы, которые Вы попросили в вопросе, соответственно:

- array2.Except(array1)
- array1.Except(array2)
- array1.Intersect(array2)
107
ответ дан Jon Skeet 24 November 2019 в 18:49
поделиться

от образцов MSDN 101 LINQ....

public void Linq52() {
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
    int[] numbersB = { 1, 3, 5, 7, 8 };

    IEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB);

    Console.WriteLine("Numbers in first array but not second array:");
    foreach (var n in aOnlyNumbers) {
        Console.WriteLine(n);
    }
}
12
ответ дан Muad'Dib 24 November 2019 в 18:49
поделиться

Я должен был сделать вещи, подобные этому с очень большими наборами данных. Если Вы имеете дело с приблизительно несколькими тысячами, используйте материал Linq, так как это намного более ясно. Но если Вы знаете, что Ваши массивы предварительно отсортированы, выполнение слияния как это может сделать это значительно быстрее, так как оно только делает одну передачу через данные и не должно выделять столько же памяти сколько версия Linq.

int iA = 0;
int iB = 0;
List<int> inA = new List<int>();
List<int> inB = new List<int>();
List<int> inBoth = new List<int>();
while (iA < numbersA.Length && iB < numbersB.Length)
{
    if (numbersA[iA] < numbersB[iB])
    {
        inA.Add(numbersA[iA++]);
    }
    else if (numbersA[iA] == numbersB[iB])
    {
        inBoth.Add(numbersA[iA++]);
        ++iB;
    }
    else
    {
        inB.Add(numbersB[iB++]);
    }
}
while (iA < numbersA.Length)
{
    inA.Add(numbersA[iA++]);
}
while (iB < numbersB.Length)
{
    inB.Add(numbersB[iB++]);
}

Снова, это действительно только необходимо, если Вы имеете дело с сотнями тысяч значений.

4
ответ дан Eclipse 24 November 2019 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: