2017-04-03 119 views
0

我有一個字符串和一個字符串的列表,我希望如果字符串包含列表中存在的任何字符串系統返回false。我使用下面的lambda表達式:Linq查詢檢查列表和字符串之間的子字符串

result = !(((string[])ro_operandVal).ToList<string>()).Any(x => x.ToString().ToUpper() == lo_operandVal.ToString().ToUpper()); 

以下是數據集:

lo_operandVal = 「ABC DEF GHI郵政信箱」 ro_operandVal是一個字符串與下列元素列表:

  1. 郵政信箱
  2. PO BOX

當我評估這個表達式時,它總是返回true。

+1

你說你想找到如果字符串*包含列表中*任何字符串目前,但是你使用* equals *進行比較。鑑於你的字符串不等於它們中的任何一個,看起來並不太令人吃驚,你沒有找到匹配。 –

回答

2

你可以試試下面的LINQ - 如果在字符串中發現在列表中的任何值,那麼它將返回false,如果沒有他們,然後發現它會返回true

var result = ro_operandVal.All(c=>lo_operandVal.IndexOf(c) < 0); 

更新

都是對象類型,你知道它們的確切類型,他們是List<string>string您可以鍵入扮演他們。

var result = ((List<string>)ro_operandVal).All(c=>lo_operandVal.ToString().IndexOf(c) < 0); 
+0

我更喜歡這種方法。您可能想要使用帶有StringComparison的'IndexOf'重載,以便您可以忽略大小寫(根據問題中的代碼)。 –

+0

ro_operand和lo_operand是對象類型 –

+0

你永遠不能在你的問題中提到這一點。順便說一句,當你知道確切的類型,他們是'列表',另一個是'字符串'你可以鍵入他們 –

0

使用.Contains()來查看文本是否包含在列表中,而不是試圖使用equals運算符完全匹配字符串。

result = !(((string[])ro_operandVal).ToList<string>()).Any(x => x.ToString().ToUpper().Contains(lo_operandVal.ToString().ToUpper())); 
+0

感謝您的編輯:p –

+1

沒有問題,您可以通過點擊您的答案下的「編輯」來自己動手......而且您還可以刪除舊評論,因此帖子看起來更乾淨... –

0

使用包含如下:

result = !(((string[])ro_operandVal).ToList<string>()).Any(x => x.ToString().ToUpper().Contains(lo_operandVal.ToString().ToUpper())); 
0

有幾個代碼問題您提供:

  1. 第一類鑄件string[],然後轉換爲List<string>,他們兩人都是IEnumerable<string>類型的,所以要麼會工作,您不需要雙重轉換
  2. 使用==運算符而不是Contains,它完成字符串比較,並且任何差異將被視爲不匹配
  3. 轉換爲ToUpper處理情況的差異,它應是StringComparison.OrdinalIgnoreCase,這將處理所有的情況下,差異

應按下述代碼,其中包括string contains擴展方法,此代碼將如果任何返回false,列表中的項目包含一個子串,從你的問題複製,按要求

result = !(ro_operandVal).ToList<string>().Any(x => x.Contains(lo_operandVal)); 

擴展方法

public static class StringExtensions 
{ 
    public static bool Contains(this string source, string subString) 
    { 
    return source?.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0; 
    } 
} 
修改
0

下面的代碼段完全爲我工作

result = !(((string[])ro_operandVal).ToList<string>().Any(lo_operandVal.ToString().Contains)); 

忽視的情況:

result = !((((string[])ro_operandVal).ToList<string>().ConvertAll(d => d.ToUpper())).Any(lo_operandVal.ToString().ToUpper().Contains));