Резюме вашей проблемы:
У вас есть коллекция данных, и вы хотите отфильтровать ее.
Это вопрос с той же проблемой , которая распространяется на эту тему немного больше. (Если быть точным, отфильтруйте объект LINQtoSQL IQueriable до его запуска в базе данных.)
Я нашел два решения, которые могут быть интересны для нашей проблемы.
Я нашел способ сделать это для данных в DataSets (ADO.NET)
DataTable source { get; set; }
String ValueMember { get; set; }
String DisplayMember { get; set; }
String FilterMember { get; set; }
Object ADOSelect(Object criterium)
{
if ((source == null) || (criterium == null)) return null;
return
(
from r in source.AsEnumerable()
where (r[FilterMember] == criterium)
select new
{
Value = r[ValueMember],
Display = r[DisplayMember]
}
).ToList();
}
И более общее решение.
class Record
{
public object Display { get; set; }
public object Value { get; set; }
}
IEnumerable<Object> source { get; set; }
String ValueMember { get; set; }
String DisplayMember { get; set; }
String FilterMember { get; set; }
Object DataSelect(Object criterium)
{
List<Record> result = new List<Record>();
foreach (var record in source) Parse(sender, record, criterium, result);
return result;
}
private void Parse(object record, Object criterium, List<Record> result)
{
MethodInfo DisplayGetter = null;
MethodInfo ValueGetter = null;
bool AddRecord = false;
foreach (PropertyInfo property in record.GetType().GetProperties())
{
if (property.Name == DisplayMember) DisplayGetter = property.GetGetMethod();
else if (property.Name == ValueMember) ValueGetter = property.GetGetMethod();
else if (property.Name == FilterMember)
{
MethodInfo ExternalGetter = property.GetGetMethod();
if (ExternalGetter == null) break;
else
{
object external = ExternalGetter.Invoke(record, new object[] { });
AddRecord = external.Equals(criterium);
if (!AddRecord) break;
}
}
if (AddRecord && (DisplayGetter != null) && (ValueGetter != null)) break;
}
if (AddRecord && (DisplayGetter != null) && (ValueGetter != null))
{
Record r = new Record();
r.Display = (DisplayGetter != null)
? DisplayGetter.Invoke(record, new object[] { })
: null;
r.Value = (ValueGetter != null)
? ValueGetter.Invoke(record, new object[] { })
: null;
result.Add(r);
}
}