Lambda方式填充ToDictionary()方法中的值字段?

Bor*_*ens 4 .net c# lambda todictionary

我有两个IEnumerable

IEnumerable<MyObject> allowedObjects = MyService.GetAllowedObjects();
IEnumerable<MyOBject> preferedObjects = MyService.GetPreferedObjects();
Run Code Online (Sandbox Code Playgroud)

我们可以安全地假设preferedObjects将始终是allowedObjects的子集.
我想创建一个IDictionary<MyObject, bool>.如果MyObject实例也在preferedObjects可枚举中,则其中键是来自allowedObjects和bool的MyObjects集合的对象为true.

我可以通过枚举它们并逐个添加它们来做到这一点,但我希望能够做到这样的事情:

IDictionary<MyObject, bool> selectedObjects = allowedObjects
    .ToDictionary(o => new KeyValuePair<MyObject, bool>()
        { Key = q,
          Value = preferedObjects.Any(q)
        }
     );
Run Code Online (Sandbox Code Playgroud)

UPDATE
Exchanged包含Any; 建议最多的解决方案是我首先尝试的,但由于某些原因不接受:

IDictionary<MyObject, bool> selectedObjects = allowedObjects
    .ToDictionary<MyObject, bool>(o => o, preferedObjects.Any(o));
Run Code Online (Sandbox Code Playgroud)

Visual Studio说第一种方法不会返回bool.这是真的,但主要是因为bool不是正确的结果开始...
然后它说它不能推断第二个lambda的类型...
正如你所看到的我试图明确定义类型来帮助推断,但它没有解决问题..

建议?

免责声明:名称和代码都是为了保持焦点应该保持原样

Mat*_*ton 5

我不记得Linq是否提供了"Contains"扩展方法IEnumerable<T>.如果没有,你可以使用Any:

var dict = allowedObjects.ToDictionary(o => o,
    o => preferredObjects.Contains(o));
Run Code Online (Sandbox Code Playgroud)

**编辑**是的,只是测试了它,确实有一个Contains()扩展方法,所以上面的代码有效.


Ric*_*ard 5

Enumerable.ToDictionary有多个重载。其中一些需要第二个委托(因此您可以传递一个 lambda)来返回与键一起使用的值。

就像是:

var secondDict = firstDictionary
                 .Where(p => SomeCondition(p))
                 .ToDictionary(p => p.Key, p => p.Value);
Run Code Online (Sandbox Code Playgroud)