programing

빈 문자열에 대한 병합?

muds 2023. 7. 30. 18:09
반응형

빈 문자열에 대한 병합?

더 있는지 입니다. (예: 점점더내자예하것확는다입니인하비있문이지에는서어자열것은신있는이고예▁something▁((▁for▁in)""또는 null) 및 조건 연산자.

현재 예:

s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;

이는 확장 방법일 뿐이며 다음과 같습니다.

string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;

에 null은 null입니다.??속임수를 쓰지 않을 것입니다.string.IsNullOrEmpty()?? 방법이 생각하고 해야 좀 더 깨끗한 방법이 있을 거라고 생각합니다만(바라건대!), 어떻게 해야 할지 막막했습니다.

이보다 더 나은 방법을 아는 사람이 있습니까? 비록 그것이 단지 안에 있다 하더라도 말입니다.넷 4.0?

은 이미 C#의 값을 C#의 값으로 대체할 수 .null와 함께??은 빈 을 그서우리필것요은빈한문다자변확다음니환장입자는하로으래로 변환하는 입니다.null그런 다음 이렇게 사용합니다.

s.SiteNumber.NullIfEmpty() ?? "No Number";

확장 클래스:

public static class StringExtensions
{
    public static string NullIfEmpty(this string s)
    {
        return string.IsNullOrEmpty(s) ? null : s;
    }
    public static string NullIfWhiteSpace(this string s)
    {
        return string.IsNullOrWhiteSpace(s) ? null : s;
    }
}

이를 위한 기본 제공 방법은 없습니다.그러나 확장 메서드가 문자열 또는 null을 반환하도록 할 수 있으므로 병합 연산자가 작동할 수 있습니다.하지만 이것은 이상할 것이고, 저는 개인적으로 당신의 현재 접근 방식을 선호합니다.

이미 확장 방법을 사용하고 있으므로 값을 반환하거나 기본값을 반환하는 방법을 만드는 것이 어떻습니까?

string result = s.SiteNumber.ConvertNullOrEmptyTo("No Number");

이것이 오래된 질문이라는 것을 알고 있습니다. 하지만 저는 답을 찾고 있었고 위의 어떤 것도 제 요구 사항과 제가 결국 사용하게 된 것에 맞지 않았습니다.

private static string Coalesce(params string[] strings)
{
    return strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
}

용도:

string result = Coalesce(s.SiteNumber, s.AltSiteNumber, "No Number");

편집: 이 기능을 더욱 간결하게 작성하는 방법은 다음과 같습니다.

static string Coalesce(params string[] strings) => strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));

사용하고 싶은 유틸리티 확장이 몇 가지 있습니다.

public static string OrDefault(this string str, string @default = default(string))
{
    return string.IsNullOrEmpty(str) ? @default : str;
}

public static object OrDefault(this string str, object @default)
{
    return string.IsNullOrEmpty(str) ? @default : str;
}

다음과 같은 모든 유형에 적용하려는 경우에도 이 옵션을 사용할 수 있습니다.

public static T OrDefault<T>(this T obj, T @default)
{
    return EqualityComparer<T>.Default.Equals(obj, default(T)) ? @default : obj;
}    

편집: sfsr의 답변에서 영감을 받아 지금부터 이 변형을 도구 상자에 추가하겠습니다.

public static string Coalesce(this string str, params string[] strings)
{
    return (new[] {str})
        .Concat(strings)
        .FirstOrDefault(s => !string.IsNullOrEmpty(s));
}

문자열이 비어 있으면 항상 null을 반환하는 NullIfEmpty 확장 메서드를 사용할 뿐입니다. 허용?(Null 병합 연산자)를 정상적으로 사용합니다.

public static string NullIfEmpty(this string s)
{
    return string.IsNullOrEmpty(s) ? null : s;
}

그러면 ??가 허용됩니다.일반적으로 사용되며 체인을 읽기 쉽게 만듭니다.

string string1 = string2.NullIfEmpty() ?? string3.NullIfEmpty() ?? string4;

널 병합 연산자의 장점 중 하나는 단락이라는 것입니다.첫 번째 부분이 null이 아닐 때는 두 번째 부분이 평가되지 않습니다.이 기능은 백업에 많은 비용이 드는 작업이 필요할 때 유용합니다.

저는 다음과 같이 끝냈습니다.

public static string Coalesce(this string s, Func<string> func)
{
    return String.IsNullOrEmpty(s) ? func() : s;
}

용도:

string navigationTitle = model?.NavigationTitle.
    Coalesce(() => RemoteTitleLookup(model?.ID)). // Expensive!
    Coalesce(() => model?.DisplayName);

앞서 제안한 것보다 약간 빠른 확장 방법은 다음과 같습니다.

public static string Fallback(this string @this, string @default = "")
{
    return (@this == null || @this.Trim().Length == 0) ? @default : @this;
}

문자열 확장 메서드 ValueOrDefault()는 어떻습니까?

public static string ValueOrDefault(this string s, string sDefault)
{
    if (string.IsNullOrEmpty(s))
        return sDefault;
    return s;
}

또는 문자열이 비어 있으면 null을 반환합니다.

public static string Value(this string s)
{
    if (string.IsNullOrEmpty(s))
        return null;
    return s;
}

하지만 이러한 해결책은 시도하지 않았습니다.

나는 나만의 문자열 Coalesce 확장 메서드를 사용하고 있습니다.여기 계신 분들은 LINQ를 사용하고 있고 시간 집약적인 운영을 위해 리소스를 낭비하고 있기 때문에(저는 엄격한 루프에서 사용하고 있습니다), 제 것을 공유하겠습니다.

public static class StringCoalesceExtension
{
    public static string Coalesce(this string s1, string s2)
    {
        return string.IsNullOrWhiteSpace(s1) ? s2 : s1;
    }
}

저는 이것이 매우 간단하고, 당신은 null 문자열 값을 신경 쓸 필요가 없다고 생각합니다.다음과 같이 사용합니다.

string s1 = null;
string s2 = "";
string s3 = "loudenvier";
string s = s1.Coalesce(s2.Coalesce(s3));
Assert.AreEqual("loudenvier", s);

많이 써요.처음 사용한 후에 없이는 살 수 없는 "유틸리티" 기능 중 하나입니다 :-)

저는 다음 확장 방법의 간결함이 좋습니다.QQQ물론 운영자가 좋아하긴 하지만 이를 위해?더 좋을 것 같습니다.그러나 두 개뿐 아니라 세 개의 문자열 옵션 값을 비교할 수 있게 함으로써 이를 하나로 늘릴 수 있습니다. 이 경우 때때로 처리해야 합니다(아래 두 번째 함수 참조).

#region QQ

[DebuggerStepThrough]
public static string QQQ(this string str, string value2)
{
    return (str != null && str.Length > 0)
        ? str
        : value2;
}

[DebuggerStepThrough]
public static string QQQ(this string str, string value2, string value3)
{
    return (str != null && str.Length > 0)
        ? str
        : (value2 != null && value2.Length > 0)
            ? value2
            : value3;
}


// Following is only two QQ, just checks null, but allows more than 1 string unlike ?? can do:

[DebuggerStepThrough]
public static string QQ(this string str, string value2, string value3)
{
    return (str != null)
        ? str
        : (value2 != null)
            ? value2
            : value3;
}

#endregion

보다 광범위한 사용을 위해 일부 답변을 제네릭이 포함된 도우미 확장 클래스로 쉽게 전환할 수 있습니다.

참고: 단락 방법에 대한 설명은 Wensveen 답변을 참조하십시오.

// classic
public static string Coalesce(this string s, params string[] strings)
  => s.Coalesce(string.IsNullOrEmpty, strings);

// short-circuit compatible, for expensive string getting
public static string Coalesce(this string s, params Func<string>[] getters)
  => s.Coalesce(string.IsNullOrEmpty, getters);

// generic
public static T Coalesce<T>(this T value, Func<T, bool> isEmpty, params T[] values) where T : class
  => isEmpty(value) ? values.FirstOrDefault(val => !isEmpty(val)) : value;

// generic, short-circuit compatible
public static T Coalesce<T>(this T value, Func<T, bool> isEmpty, params Func<T>[] getters) where T : class {
  if (isEmpty(value))
    return getters
      .Select(getter => new Lazy<T>(getter))
      .FirstOrDefault(val => !isEmpty(val.Value))
      ?.Value;

  return value;
}

사용 예:

string result = s.SiteNumber.Coalesce(s.AltSiteNumber, "No Number");

string result = s.SiteNumber.Coalesce(string.IsNullOrWhiteSpace, s.AltSiteNumber, "No Number");

string navigationTitle = model?.NavigationTitle.
  Coalesce(() => RemoteTitleLookup(model?.ID), () => model?.DisplayName);

Player player = player1.Coalesce(p => p?.Score > 0, player2, player3);

(PS: 제 생각에 저는 제네릭을 사용해서 여기서 약간 주제에서 벗어난 것 같습니다.제가 이것을 너무 많이 생각하고 있나요?)

sqlCom.Parameters.Add(new SqlParameter("@qavCode", SqlDbType.Char, 11)).Value = (object)(string.IsNullOrEmpty(rf.Request.QavCode) ? null : rf.Request.QavCode) ?? DBNull.Value;

잘 모르겠습니다. 제가 이 질문에 대답하는 것이 너무 늦었을 수도 있지만 제 예에서 저는 정규 3항을 혼합했습니다. 즉, null-Coalesing 연산자에 대한 것입니다.이 사람도 빈 문자열로 작업할 수 있습니다.도움이 되길 바랍니다 :)

언급URL : https://stackoverflow.com/questions/2420125/coalesce-for-empty-string

반응형