IEnumerable string join в C # .NetStandard 2.0

Я пытаюсь написать библиотеку с .NetStandard 2.0, и, по-видимому, нет перегрузки для метода string.Join, который принимает IEnumerable. Этот код отлично работает в .NetCore 2.0, но не стандарт:

string.Join('/', parts.Skip(index))

person eltiare    schedule 10.04.2018    source источник
comment
Так в чем твой вопрос?   -  person Ron Beyer    schedule 10.04.2018
comment
Что означает, но не стандарт? .Net Core 2.0 - это реализация .Net Standard 2, как и .Net Framework 4.6.1. Ваш вопрос не имеет смысла   -  person phuzi    schedule 10.04.2018
comment
В моем проекте .NET Standard 2.0 есть string.Join(string, IEnumerable<string>) перегрузка ... Может, вам понадобится string.Substring вместо parts.Skip?   -  person Ron Beyer    schedule 10.04.2018
comment
Согласно документации эта перегрузка существует. Включите минимальный воспроизводимый пример в свой вопрос, чтобы мы могли попытаться воспроизвести вашу проблему. Я полагаю, что Parts - это не IEnumerable ‹string›   -  person maccettura    schedule 10.04.2018
comment
@maccettura смотри очень внимательно - немного другая перегрузка, и eltiare не ошибается: она отсутствует, но не очень   -  person Marc Gravell    schedule 10.04.2018
comment
Я пытаюсь создать библиотеку .NetStandard из того, что я построил с помощью .NetCore, и в этой строке появляется сообщение об ошибке. Говорит нет подходящей перегрузки. Из моего чтения документов кажется, что он должен быть там.   -  person eltiare    schedule 10.04.2018
comment
@MarcGravell о, хороший глаз. Хотя существует ли перегрузка char в обычном .NET? Я никогда не помню, чтобы использовал это (на мобильном телефоне теперь так сложно искать)   -  person maccettura    schedule 10.04.2018
comment
@maccettura да; это действительно кажется довольно ненужным, хотя, чтобы быть справедливым   -  person Marc Gravell    schedule 10.04.2018


Ответы (2)


Перегрузка существует с string separator вместо просто char separator:

string s = string.Join("/", parts.Skip(index));

так ... использовать это?

person Marc Gravell    schedule 10.04.2018
comment
@RonBeyer, почему ты так говоришь? Я предполагаю, что parts это IEnumerable<string>? Вы предполагаете, что parts на самом деле string? - person Marc Gravell; 10.04.2018
comment
Я полагаю, вы можете быть правы (без пояснения OP), что parts - это IEnumerable<string>, я предполагаю, что это была одна строка. - person Ron Beyer; 10.04.2018
comment
Parts - это IEnumerable ‹string›, и я получаю сообщение об ошибке в JetBrains rider на Mac. Я, наверное, должен сделать чистку и перестройку, чтобы убедиться ... - person eltiare; 10.04.2018
comment
@eltiare Я создаю новый проект библиотеки <TargetFramework>netstandard2.0</TargetFramework>, и, похоже, он работает нормально , пока вы используете string в качестве разделителя ... - person Marc Gravell; 10.04.2018
comment
Итак, мы идем. Это исправило это. Странно, что он работает в .NetCore, но не в .NetStandard. - person eltiare; 10.04.2018

Чтобы добавить немного контекста к ответу Марка Гравелла: .NET Standard и .NET Core имеют другой набор API.

.NET Standard представляет собой набор API-интерфейсов, которые должны быть реализованы платформой, если она поддерживает версию .NET Standard.

.NET Core - это платформа, реализующая .NET Standard. Помимо этих API, он реализует еще несколько.

API, доступные в .NET Standard для string.Join: (из https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs):

    public static System.String Join(System.String separator, System.Collections.Generic.IEnumerable<string> values) { throw null; }
    public static System.String Join(System.String separator, params object[] values) { throw null; }
    public static System.String Join(System.String separator, params string[] value) { throw null; }
    public static System.String Join(System.String separator, string[] value, int startIndex, int count) { throw null; }
    public static System.String Join<T>(System.String separator, System.Collections.Generic.IEnumerable<T> values) { throw null; }

Для .NET Core набор API-интерфейсов больше, поскольку API-интерфейсы были добавлены в платформу .NET Core, но не в .NET Standard (из https://github.com/dotnet/corefx/blob/master/src/System.Runtime/ref/System.Runtime.cs#L2307):

    public static System.String Join(char separator, params object[] values) { throw null; }
    public static System.String Join(char separator, params string[] value) { throw null; }
    public static System.String Join(char separator, string[] value, int startIndex, int count) { throw null; }
    public static System.String Join(System.String separator, System.Collections.Generic.IEnumerable<string> values) { throw null; }
    public static System.String Join(System.String separator, params object[] values) { throw null; }
    public static System.String Join(System.String separator, params string[] value) { throw null; }
    public static System.String Join(System.String separator, string[] value, int startIndex, int count) { throw null; }
    public static System.String Join<T>(char separator, System.Collections.Generic.IEnumerable<T> values) { throw null; }
    public static System.String Join<T>(System.String separator, System.Collections.Generic.IEnumerable<T> values) { throw null; }

Если вы ориентируетесь на .NET Core, вы можете использовать перегрузку, которая принимает char. Если вы ориентируетесь на .NET Standard, вы можете использовать перегрузку, которая принимает string.

person Alex Ghiondea - MSFT    schedule 10.04.2018