Surely there's a better way to write this statement? I have the following, quite ugly statement - is there a better way to write something of this nature?

if (!item["Created By"].ToString().Contains("System Account") &amp;&amp;
    !item.Url.Contains("_catalogs") &amp;&amp;
    !item.Url.Contains("Style Library") &amp;&amp;
    !item.Url.Contains("Cache Profiles") &amp;&amp; 
    !item.ContentType.ToString().Contains("Theme Gallery") &amp;&amp;
    !item.ContentType.ToString().Contains("Converted Forms") &amp;&amp;
    !item.ContentType.ToString().Contains("Page Output Cache") &amp;&amp;
    !item.ContentType.ToString().Contains("Master Page"))
{
    query.RecordItems(item.ID.ToString(), item.ContentType.Name,
                        item.DisplayName, item.Name,
                        "", item.Url, item["Created By"].ToString(),
                        "",
                        Convert.ToDateTime(item["Modified"]),
                        item["Modified By"].ToString(),
                        Convert.ToDateTime(item["Created"]),
                        item["Created By"].ToString());
}


For a frame of reference, here's the proceeding code:

using (var web = activeSiteCollection.OpenWeb())
{
    foreach (SPList list in web.Lists)
    {
        query.RecordLists(list.ID.ToString(), list.Author.ToString(), list.Title,
                            list.DefaultViewUrl,
                            list.ParentWeb.Title, list.ParentWebUrl, list.ItemCount,
                            list.LastItemModifiedDate, list.LastItemDeletedDate);

        // check if files exist in the document library, if they don't break out to next level
        if (list.ItemCount &lt;= 0) continue;

        for (int i = 0; i &lt; list.Items.Count; i++)
        {
            try
            {
                SPListItem item = list.Items[i];

                if (!item["Created By"].ToString().Contains("System Account") &amp;&amp;
                    !item.Url.Contains("_catalogs") &amp;&amp;
                    !item.Url.Contains("Style Library") &amp;&amp;
                    !item.Url.Contains("Cache Profiles") &amp;&amp; 
                    !item.ContentType.ToString().Contains("Theme Gallery") &amp;&amp;
                    !item.ContentType.ToString().Contains("Converted Forms") &amp;&amp;
                    !item.ContentType.ToString().Contains("Page Output Cache") &amp;&amp;
                    !item.ContentType.ToString().Contains("Master Page"))
                {
                    query.RecordItems(item.ID.ToString(), item.ContentType.Name,
                                        item.DisplayName, item.Name,
                                        "", item.Url, item["Created By"].ToString(),
                                        "",
                                        Convert.ToDateTime(item["Modified"]),
                                        item["Modified By"].ToString(),
                                        Convert.ToDateTime(item["Created"]),
                                        item["Created By"].ToString());
                }
            }
            catch (NullReferenceException)
            {
                SPListItem item = list.Items[i];

                Logger.Error(
                    "[{0}] Filed moving on file {1} as not all content was present",
                    item.Name);
            }

        }
As well as some standard indenting, a quick thought could be reversing the item being compared and using some temporary variables for readability.  

EDIT:
Ok, so svick pointed out that the original code was fundamentally flawed.  So how about creating an extension method on string to do the Contains for us.  Something like:

// Method would do well with some unit tests ....
public static bool ContainsAny(this string source, string[] findStr)
{
    return findStr.Any(p =&gt; source.Contains(p));
}


Then used like

var contentTypes = new [] { "Theme Gallery", "Converted Forms", "Page Output Cache", "Master Page" };
var urls = new[] { "_catalogs", "Style Library", "Cache Profiles" };
var accounts = new [] { "System Account" };

var contentType = item.ContentType.ToString();
var createdBy = item["Created By"].ToString();

if (!createdBy.ContainsAny(accounts) &amp;&amp;
    !item.Url.ContainsAny(urls) &amp;&amp;
    !contentType.ContainsAny(contentTypes))
{
    query.RecordItems(
            item.ID.ToString(), 
            item.ContentType.Name,
            item.DisplayName, 
            item.Name,
            "", 
            item.Url, 
            createdBy,
            "",
            Convert.ToDateTime(item["Modified"]),
            item["Modified By"].ToString(),
            Convert.ToDateTime(item["Created"]),
            createdBy);
}


Also, do you need to catch the exception in this method?  Could you not just handle that situation in an if statement as it looks like you are letting the exception handle the case where one of the values is null when a simple null check would suffice??