Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Фильтрация коллекций в C#
Я ищу очень быстрый способ отфильтровать коллекцию в C#. в настоящее время я использую универсальные List<object> коллекции, но открыт для использования других структур, если они работают лучше.
В настоящее время я просто создаю новый List<object> и зацикливаюсь на исходном списке. Если критерии фильтрации совпадают, я помещаю копию в новый список.
Есть ли лучший способ сделать это? Есть ли способ фильтровать на месте, чтобы не было необходимости во временном списке?
Если вы используете 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; в верхней части файла.
Вот блок кода / пример некоторой фильтрации списков с использованием трех различных методов, которые я собрал вместе, чтобы показать фильтрацию списков на основе лямбд и 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
List имеет метод FindAll, который будет выполнять фильтрацию для вас и возвращать подмножество списка.
msdn имеет отличный пример кода здесь: http://msdn.microsoft.com/en-us/library/aa701359(VS.80).aspx
EDIT: я написал это до того, как у меня было хорошее понимание метода Linq и Where(). Если бы я написал это сегодня, то, вероятно, использовал бы метод, о котором упоминал Хорхе выше. Однако метод FindAll все еще работает, если вы застряли в среде .NET 2.0.
Вы можете использовать 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, когда это необходимо, и в некоторых случаях, когда вы не используете все элементы в отфильтрованной коллекции,это может обеспечить некоторое повышение производительности.
Использование Linq относительно медленнее, чем использование предиката, поставляемого в метод Lists FindAll. Также нужно быть осторожным с Linq, так как эвмерация списка фактически не выполняется, пока вы не получите доступ к результату. Это может означать, что, когда вы думаете, что создали отфильтрованный список, содержание может отличаться от того, что вы ожидали, когда фактически читали его.
Чтобы сделать это на месте, вы можете использовать метод RemoveAll класса "List<>" вместе с пользовательским "Predicate" class...but все, что нужно сделать, это очистить код... под капотом он делает то же самое, что и вы are...but да, он делает это на месте, поэтому вы делаете то же самое в списке temp.