Фильтрация наборов в C#

Это проблема Пакмана. Вы должны искать или определять соседей каждого значения матрицы. Затем пересечь матрицу, следуя за соседями каждого значения матрицы. Обычно разрешается с помощью рекурсивных функций. Я думаю, что ваш код должен быть изменен с нуля, используя другой подход.

128
задан Jason Z 25 August 2008 в 15:11
поделиться

7 ответов

При использовании 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; наверху файла.

216
ответ дан 24 November 2019 в 00:38
поделиться

List<T> имеет FindAll метод, который сделает фильтрацию для Вас и возвратит подмножество списка.

MSDN имеет большой пример кода здесь: http://msdn.microsoft.com/en-us/library/aa701359 (По сравнению с 80) РЕДАКТИРОВАНИЕМ .aspx

: Я записал это, прежде чем у меня было хорошее понимание LINQ и Where() метод. Если бы я должен был записать это сегодня, то я, вероятно, использовал бы метод, который упоминает выше Jorge. FindAll метод все еще работает, если Вы застреваете в.NET 2,0 среды все же.

10
ответ дан 24 November 2019 в 00:38
поделиться

Вот блок кода / пример некоторой фильтрации списка с помощью трех различных методов, которые я соединил, чтобы показать Лямбдам и 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
21
ответ дан 24 November 2019 в 00:38
поделиться

Можно использовать 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 при необходимости и в некоторых случаях что Вы не используете все объекты в фильтрованном наборе, она может обеспечить некоторое хорошее увеличение производительности.

6
ответ дан 24 November 2019 в 00:38
поделиться

Можно использовать метод FindAll Списка, обеспечивая делегату для фильтрации на. Хотя, я соглашаюсь с IainMH, который не стоит волновать самостоятельно слишком много, если это не огромный список.

4
ответ дан 24 November 2019 в 00:38
поделиться

Чтобы сделать это на месте, можно использовать метод RemoveAll "List<>" класс наряду с пользовательским классом "Предиката"..., но все, что делает, является уборкой код... под капотом, это делает то же самое, которое Вы..., но да, это делает это на месте, таким образом, Вы делаете то же временный список.

3
ответ дан 24 November 2019 в 00:38
поделиться

при использовании C# 3.0, можно использовать linq

Или, если Вы предпочитаете, используйте специальный синтаксис запроса, обеспеченный компилятором C# 3:

var filteredList = from x in myList
                   where x > 7
                   select x;
2
ответ дан 24 November 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: