Это проблема Пакмана. Вы должны искать или определять соседей каждого значения матрицы. Затем пересечь матрицу, следуя за соседями каждого значения матрицы. Обычно разрешается с помощью рекурсивных функций. Я думаю, что ваш код должен быть изменен с нуля, используя другой подход.
При использовании C# 3.0, можно использовать linq, путь лучше и более изящный путь:
List<int> myList = GetListOfIntsFromSomewhere();
// This will filter out the list of ints that are > than 7, Where returns an
// IEnumerable<T> so a call to ToList is required to convert back to a List<T>.
List<int> filteredList = myList.Where( x => x > 7).ToList();
, Если Вы не можете найти эти .Where
, который означает, необходимо импортировать using System.Linq;
наверху файла.
List<T>
имеет FindAll
метод, который сделает фильтрацию для Вас и возвратит подмножество списка.
MSDN имеет большой пример кода здесь: http://msdn.microsoft.com/en-us/library/aa701359 (По сравнению с 80) РЕДАКТИРОВАНИЕМ .aspx
: Я записал это, прежде чем у меня было хорошее понимание LINQ и Where()
метод. Если бы я должен был записать это сегодня, то я, вероятно, использовал бы метод, который упоминает выше Jorge. FindAll
метод все еще работает, если Вы застреваете в.NET 2,0 среды все же.
Вот блок кода / пример некоторой фильтрации списка с помощью трех различных методов, которые я соединил, чтобы показать Лямбдам и LINQ базирующуюся фильтрацию списка.
#region List Filtering
static void Main(string[] args)
{
ListFiltering();
Console.ReadLine();
}
private static void ListFiltering()
{
var PersonList = new List<Person>();
PersonList.Add(new Person() { Age = 23, Name = "Jon", Gender = "M" }); //Non-Constructor Object Property Initialization
PersonList.Add(new Person() { Age = 24, Name = "Jack", Gender = "M" });
PersonList.Add(new Person() { Age = 29, Name = "Billy", Gender = "M" });
PersonList.Add(new Person() { Age = 33, Name = "Bob", Gender = "M" });
PersonList.Add(new Person() { Age = 45, Name = "Frank", Gender = "M" });
PersonList.Add(new Person() { Age = 24, Name = "Anna", Gender = "F" });
PersonList.Add(new Person() { Age = 29, Name = "Sue", Gender = "F" });
PersonList.Add(new Person() { Age = 35, Name = "Sally", Gender = "F" });
PersonList.Add(new Person() { Age = 36, Name = "Jane", Gender = "F" });
PersonList.Add(new Person() { Age = 42, Name = "Jill", Gender = "F" });
//Logic: Show me all males that are less than 30 years old.
Console.WriteLine("");
//Iterative Method
Console.WriteLine("List Filter Normal Way:");
foreach (var p in PersonList)
if (p.Gender == "M" && p.Age < 30)
Console.WriteLine(p.Name + " is " + p.Age);
Console.WriteLine("");
//Lambda Filter Method
Console.WriteLine("List Filter Lambda Way");
foreach (var p in PersonList.Where(p => (p.Gender == "M" && p.Age < 30))) //.Where is an extension method
Console.WriteLine(p.Name + " is " + p.Age);
Console.WriteLine("");
//LINQ Query Method
Console.WriteLine("List Filter LINQ Way:");
foreach (var v in from p in PersonList
where p.Gender == "M" && p.Age < 30
select new { p.Name, p.Age })
Console.WriteLine(v.Name + " is " + v.Age);
}
private class Person
{
public Person() { }
public int Age { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
}
#endregion
Можно использовать IEnumerable для избавления от необходимости временного списка.
public IEnumerable<T> GetFilteredItems(IEnumerable<T> collection)
{
foreach (T item in collection)
if (Matches<T>(item))
{
yield return item;
}
}
, где Соответствия название Вашего метода фильтра. И можно использовать это как:
IEnumerable<MyType> filteredItems = GetFilteredItems(myList);
foreach (MyType item in filteredItems)
{
// do sth with your filtered items
}
Это вызовет функцию GetFilteredItems при необходимости и в некоторых случаях что Вы не используете все объекты в фильтрованном наборе, она может обеспечить некоторое хорошее увеличение производительности.
Можно использовать метод FindAll Списка, обеспечивая делегату для фильтрации на. Хотя, я соглашаюсь с IainMH, который не стоит волновать самостоятельно слишком много, если это не огромный список.
Чтобы сделать это на месте, можно использовать метод RemoveAll "List<>" класс наряду с пользовательским классом "Предиката"..., но все, что делает, является уборкой код... под капотом, это делает то же самое, которое Вы..., но да, это делает это на месте, таким образом, Вы делаете то же временный список.
при использовании C# 3.0, можно использовать linq
Или, если Вы предпочитаете, используйте специальный синтаксис запроса, обеспеченный компилятором C# 3:
var filteredList = from x in myList
where x > 7
select x;