我有一个小问题:)我有一个列表,其中一些参数是重复的。我必须删除它。我不能使用Distinct becouse我只能看到在一些领域(不是全部)。我认为这是使用lambda epxressions的好选择。动态在哪里条件
我对我的对象有一个声明,我工作的人不一样,但想法是相似的。
var keys = new string[] {"column1", "column2"};
var repeatedValues = new object[] {5, 15};
var values = new List<Dictionary<string, object>>();
//MAKE FAKE DOUBLE
values.Add(new Dictionary<string, object> {
{ "column1", 5 }, { "column2", 15 }, { "column3", "test" },
{ "column4", "test1" } });
for (int i = 0; i < 10; i++)
{
values.Add(new Dictionary<string, object> {
{"column1", i}, {"column2", 10 + i}, "column3", "test"},
{"column4", "test1"}});
}
的键列始终具有相同的lenght为repeatedValues - 而改变,一些lenghts是1,其他2,3,5。不超过5个
这些键就像数据库表上的primaryKeys。它非常相似。所以我们在“主键列”中寻找重复内容 - 我认为这是一个很好的比较。
我们在该示例中看到,“column1”中的值为5,“column2”中的值为15。我以前说我必须删除那个,但在我必须重复项目之前。
我尝试做这样的代码(我知道FUNC方法awalys失败becouse(对象)1 ==(对象)1总是返回假,但它的例子:
Expression expression = null;
for (int i = 0; i < keys.Length; i++)
{
Expression<Func<Dictionary<string, object>, bool>> exp = x => x[keys[i]] == repeatedValues[i];
if (expression == null)
expression = exp.Body;
else
expression = Expression.AndAlso(expression, exp.Body);
}
var parameterExpression = Expression.Parameter(typeof (Dictionary<string, object>), "x");
var lamba = Expression.Lambda<Func<Dictionary<string, object>, bool>>(expression, parameterExpression);
var res = lamba.Compile();
var counts = queryLis.Count(res);
但compilator给我一个例外 变量'x'的类型'System.Collections.Generic.Dictionary`2'System.String,System.Object]'from scope'',但它没有被定义
可以这样做?
(不是例外)在其他步骤也许该表达式要求例如重复值[i](之后),它将不知道它是什么?
这是一个选项,但我尝试使用HashSet和StringBuilder - 它工作得更快,但是如果我使用表达式树,它的工作速度会加快一半 - 我不喜欢,但它是真的 – user1091406 2012-03-14 21:21:24
是的,这是概念验证和进一步优化的起点。 – 2012-03-14 21:40:55