比if / else检查索引数组更好的方法

时间:2013-06-11 22:21:23

标签: c# asp.net

我正在制定索引越界错误,我理解为什么我会得到它。我正在寻找的可能是c#的一些功能我可能不知道而不是使用笨重的if / else语句。

如果Active Directory用户没有作业标题,则会输出该错误,因为它不会加载该属性,因此我甚至不知道rs.Propterties [“title”]。

有没有比if(rs.Properties [“title”]更简洁的方法。计数)

user.jobTitle = rs.Properties["title"][0].ToString();

我正在研究不同的运营商,比如?和?:但无法弄清楚如何使它们正常工作。

rs.Properties的类型为SearchResult:

使用System.DirectoryServices;
使用System.DirectoryServices.ActiveDirectory;
使用System.DirectoryServices.AccountManagement;

3 个答案:

答案 0 :(得分:3)

怎么样:

user.jobTitle = (rs.Properties["title"].FirstOrDefault() ?? "").ToString();

假设rs.Properties["title"]的类型为IEnumerable<object>或类似的东西。如果只是IEnumerable,则需要以下内容:

user.jobTitle = (rs.Properties["title"]
                   .Cast<object>()
                   .FirstOrDefault() ?? "").ToString();

如果集合为空,FirstOrDefault调用将返回null。

(现在我们知道rs的类型,看起来后者是必需的。)

您可能希望将其包装到您自己的扩展方法中,当然:

public static string GetFirstProperty(this SearchResult result,
                                      string propertyName,
                                      string defaultValue)
{
    return result.Properties[propertyName]
                 .Cast<object>()
                 .FirstOrDefault() ?? defaultValue).ToString();
}

答案 1 :(得分:2)

选项1

user.jobTitle = rs.Properties.Contains("Title") ? rs.Properties["Title"][0].ToString() : string.Empty;

选项2

public static class SearchResultHelper
{
    public static string GetValue(this SearchResult searchResult, string propertyName)
    {
        return searchResult.Properties.Contains(propertyName) ? searchResult.Properties[propertyName][0].ToString() : string.Empty;
    }
}

通话看起来像

user.JobTitle = rs.Properties.GetValue("Title")

感谢AD示例的http://www.codeproject.com/KB/system/getuserfrmactdircsharp.aspx

答案 2 :(得分:1)

这是你要找的吗?

user.jobTitle = rs.Properties["title"]
    .Cast<object>()
    .FirstOrDefault()
    .MaybePipe(x => x.ToString());

我到处使用的助手功能:

public static TResult MaybePipe(this T obj, Func<T, TResult> func)
{
    return obj != null ? func(obj) : default(T);
}