2017-06-09 91 views
2

我希望這將是相當簡單的,因爲我缺乏作爲初學者的知識,但我試圖查看是否有兩個元素的整數數組在列表中。搜索列表int []找到匹配的int []

Int[] meh = {1,2}; 

List<int[]> list1 = new List<int[]>(); 

List1.Add(meh); 

Int[] meh2 = {1,2}; 

If(List1.Contains(meh2)) 
{ 
    Console.WriteLine(「Found it」); 
} 

從閱讀周圍據我瞭解,不會被發現,因爲它是與清單如何比較參照,而不是值對象做陣列......所有例子伊夫發現已經在一個陣列中找到單個int一個List,但不是整個數組。

林隱約知道,List.Find()可能在這裏很有用,但我不能看到如何使用LINQ匹配列表中每個數組中的兩個元素。

任何幫助或指向閱讀材料非常感謝。

在此先感謝。

+0

通過參考進行比較。你應該編寫你自己的'Contains'方法。 – dcg

回答

3

這個怎麼樣

if(list1.Any(x => x.SequenceEqual(meh2))) 
{ 
    Console.WriteLine("Found it"); 
} 
+1

美麗!謝謝。簡短,作品和易於理解。當它讓我來的時候,我會將它標記爲答案! – Dan

+0

作爲對此的擴展 - 現在我知道它在列表中,是否有同樣簡單的方法來刪除它?因爲List.remove()將通過比較對象並返回索引位置來查找相同的問題? – Dan

+0

嗨,我想這樣的事情應該做的伎倆:list1.RemoveAll(x => meh2.Contains(x)); (還沒有測試過)。考慮到你通過檢查前面的內容來調用它,否則它可能會部分刪除你不想要的元素。編輯:我認爲這可能不安全,因爲它仍然會移除包含在數組中的元素,但在不同的索引位置列表中。 –

0

不知道你想實現什麼。如果list1有一個元素[1,2,3],並且您搜索[1,2],那麼這是匹配還是所有元素必須匹配?他們是否必須以相同的順序? ......不管你想實現準確

,你可以用Any()SequenceEqual()

int[] meh = {1, 2}; 
int[] meh2 = {1, 5}; 
var list1 = new List<int[]>() {meh, meh2}; 

if (list1.Any(x => x.SequenceEqual(new[] {1, 5}))) 
{ 
    Console.WriteLine("Found it"); 
} 

另見this answer做到這一點。它包含其中兩個陣列會先被排序(即忽略了陣列中的元素的順序)

1

可以使用的示例Enumerable.SequenceEqual

,將返回-1,如果該序列沒有找到

示例:

var myArr = new int[] { 3, 3 }; 
List<int[]> ListOfArrays = new List<int[]> 
{ 
    new int[] { 0, 0 }, 
    new int[] { 2, 2 }, 
    new int[] { 1, 1 }, 
    new int[] { 3, 3 } 
}; 
var index = ListOfArrays.FindIndex(l => Enumerable.SequenceEqual(myArr, l)); 
Console.WriteLine("here: " + index); 
相關問題