Как объединить 2 списка с помощью LINQ?

Существует только обходной путь для проблемы, с которой вы сталкиваетесь.

Перед запуском процесса копирования проверьте, не запущен ли файл. Вы можете вызвать следующую функцию, пока не получите значение False.

1st Method, скопированный непосредственно из этого ответа :

private bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not locked
    return false;
}

2nd Method:

const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;
private bool IsFileLocked(string file)
{
    //check that problem is not in destination file
    if (File.Exists(file) == true)
    {
        FileStream stream = null;
        try
        {
            stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (Exception ex2)
        {
            //_log.WriteLog(ex2, "Error in checking whether file is locked " + file);
            int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1);
            if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION))
            {
                return true;
            }
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }
    }
    return false;
}

29
задан Serge Wautier 26 January 2011 в 15:35
поделиться

3 ответа

По сути, вы хотите сгенерировать декартово произведение, а затем объединить элементы каждого 2-кортежа. Это проще всего сделать в синтаксисе запроса:

var cartesianConcat = from a in seq1
                      from b in seq2
                      select a + b;
37
ответ дан Ani 26 January 2011 в 15:35
поделиться

Используйте SelectMany, когда вы хотите сформировать декартово произведение двух списков:

aList.SelectMany(a => bList.Select(b => a + b))

59
ответ дан Ian Mercer 26 January 2011 в 15:35
поделиться
119 Я лично нахожу это легче понять, так как он ближе к версии «множественного числа»: для каждого «a» в «aList» мы создаем новую последовательность - в этом случае это всегда «bList». Для каждой пары (a, b), полученной декартовым объединением, мы проецируем на результат, который является просто объединением двух.

1111 Просто чтобы прояснить: оба подхода будут работать. Я просто предпочитаю это:)

Относительно того, понятнее ли это, чем синтаксис выражения запроса ... Я не уверен. Я обычно использую вызовы методов, когда это просто случай использования одного оператора, но для Join, GroupJoin, SelectMany и GroupBy выражения запросов действительно упрощают вещи. Попробуйте оба варианта и посмотрите, какие вы найдете более читабельными:)

25
ответ дан Jon Skeet 26 January 2011 в 15:35
поделиться
Другие вопросы по тегам:

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