c#中更好的检查字符串null的方法

本文关键字:null 方法 字符串 检查 更好 | 更新日期: 2023-09-27 17:52:38

一个方法接受大约7个字符串参数,需要检查它们是否为空所有这些的基本方法都是简单的!string.IsNullOrWhitespace(param1),类似的有没有更好或更聪明的方法?此外,如果有帮助的话,我可以将参数包装在对象中!

c#中更好的检查字符串null的方法

In case any null将是false for you:

bool CheckAnyNull(params string[] strs)
{
    foreach (var str in strs)
    {
        if (strs.IsNullOrWhiteSpace(str))
            return true;
    }
    return false;
}

如果您想检查它们是否所有 null:

bool CheckAllNull(params string[] strs)
{
    foreach (var str in strs)
    {
        if (!strs.IsNullOrWhiteSpace(str))
            return false;
    }
    return true;
}

如果您想要null字符串的特定数量:

int CheckNullCount(params string[] strs)
{
    int count;
    foreach (var str in strs)
    {
        if (strs.IsNullOrWhiteSpace(str))
            count++;
    }
    return count;
}

它们都可以这样调用:

CheckAnyNulls(str1, str2, str3, str4, str5, str6, str7);
CheckAllNulls(str1, str2, str3, str4, str5, str6, str7);
int nullStrs = CheckNullCount(str1, str2, str3, str4, str5, str6, str7);

或:

var strs = new string[7];
// populate the strs array.
CheckAnyNulls(strs);
CheckAllNulls(strs);
int nullStrs = CheckNullCount(strs);

您可以将字符串传递给list,然后像这样检查:

if(List.All(x=>string.IsNullOrWhiteSpace(x)))
{
}

如果您希望返回任何一个不为空的字符串,那么这是一个很好的解决方案:

public static bool AreAllStringsEmpty(params string[] array)
{
    return array.All(str => String.IsNullOrWhiteSpace(str));
}
public static bool AreAllStringsFull(params string[] array)
{
    return array.All(str => !String.IsNullOrWhiteSpace(str));
}
public static bool AreAtleastOneStringFull(params string[] array)
{
    return array.Any(str => !String.IsNullOrWhiteSpace(str));
}

然后像这样使用:

AreAllStringsFull(param1, param2, ...);

备注:您可以添加扩展方法来简化过程,但它仍然是样板代码

如果您不需要检查空白,只需比较null:

if (param1 != null)

通常,如果要求输入不为空,则会抛出ArgumentNullException:

if (param1 == null)
   throw new ArgumentNullException("param1");

您可以使用反射构建一个扩展方法来一次检查整个对象。然而,由于这样做的代价很高,您可以使用FastMember之类的库来最小化后续对象检查时的反射成本。

using System.Linq;
using FastMember;
namespace Utilities
{
    public static class CheckStringProperties
    {
        public static bool AreAnyStringPropertiesNull<T>(this T model) where T : class
        {
            var accessor = TypeAccessor.Create(model.GetType());
            return AreAnyStringPropertiesNull(model, accessor);
        }
        public static bool AreAnyStringPropertiesNull<T>(this T model) where T : class
        {
            var accessor = TypeAccessor.Create(model.GetType());
            return AreAllStringPropertiesNull(model, accessor);
        }
        private static bool AreAnyStringPropertiesNull<T>(T model, TypeAccessor accessor)
        {
            foreach (var strng in GetStringProperties(accessor))
            {
                if (string.IsNullOrWhiteSpace(strng))
                    return true;
            }
            return false;
        }
        private static bool AreAllStringPropertiesNull<T>(T model, TypeAccessor accessor)
        {
            foreach (var strng in GetStringProperties(accessor))
            {
                if (!string.IsNullOrWhiteSpace(strng))
                    return true;
            }
            return false;
        }
        private static List<Member> GetStringProperties(TypeAccessor accessor)
        {
            return accessor.GetMembers().Where(x => x.Type == typeof(string)).ToList();
        }
    }
}

你可以在你的类中调用扩展方法。

var containsNulls = classInstance.AreAnyStringPropertiesNull();
var areAllNull = classInstance.AreAllStringPropertiesNull();