Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何直接返回ILookup(无需使用字典->;ILookup转换器)_C#_Linq_Dictionary_Lookup_Yield Return - Fatal编程技术网

C# 如何直接返回ILookup(无需使用字典->;ILookup转换器)

C# 如何直接返回ILookup(无需使用字典->;ILookup转换器),c#,linq,dictionary,lookup,yield-return,C#,Linq,Dictionary,Lookup,Yield Return,(将词典转换为ILookup不是很好: ) 我希望使用以下方法为容器类创建接口: ILookup<Type, Entry> Query ( IEnumerable<QueryClause> query ); ILookup查询(IEnumerable查询); 每个查询子句指定从基础容器中取出的特殊类型的条目的种类和数量(以及更多细节) 我的实现目前看起来像这样: var result = new Dictionary<Type, List<Entry>

(将
词典
转换为
ILookup
不是很好: )

我希望使用以下方法为容器类创建接口:

ILookup<Type, Entry> Query ( IEnumerable<QueryClause> query );
ILookup查询(IEnumerable查询);
每个查询子句指定从基础容器中取出的特殊类型的条目的种类和数量(以及更多细节)

我的实现目前看起来像这样:

var result = new Dictionary<Type, List<Entry>>();

foreach(var clause in query)
{
    var clauseResult = FulfillClause(clause);
    result.Add(clause.Type, clauseResult);
}

return result.ToLookup(); // here it is
var result=newdictionary();
foreach(查询中的var子句)
{
var ClaureResult=履行义务(第条);
结果。添加(条款类型,条款结果);
}
返回结果。ToLookup();//给你

这个方法是否有可能直接返回我的
ILookup
?不幸的是,它不支持
收益返回

我不完全清楚为什么您首先要使用字典。这对你有用吗

return query.ToLookup(clause => clause.Type, clause => FullFillClause(clause));
它不符合
ILookup
界面,但也不符合您提供的代码,因此我无法确定您实际想要什么

在重读问题之后,这里是一个尝试:

return query.SelectMany(c => FulfillClause(c).Select(r => new {Type=c.Type, Result=r}))
            .ToLookup(o => o.Type, o => o.Result);
这是@JonSkeet链接答案的翻译

为了在不了解所有类型和方法的详细信息的情况下进行测试,我使用了以下方法:

Func<List<int>> f = () => new List<int>() {1, 2, 3};
var query = new List<Type> {typeof (int), typeof (string)};

var l = query.SelectMany(t => f().Select(n => new {Type = t, Result = n}))
    .ToLookup(o => o.Type, o => o.Result);
Func f=()=>newlist(){1,2,3};
var query=新列表{typeof(int),typeof(string)};
var l=query.SelectMany(t=>f().Select(n=>new{Type=t,Result=n}))
.ToLookup(o=>o.Type,o=>o.Result);

如果您控制了所有代码,则可以对其中一些代码进行重组以增强可读性:

return query.SelectMany(c => c.Fulfill())
            .ToLookup(res => res.Type, res => res.Value);

...
// You will need to create the ClauseFulfillment type yourself
public IEnumerable<ClauseFulfillment> FulFill()
{
   var results = // whatever FulfillClause does
   foreach(var r in results)
      yield return new ClauseFulfillment {Type = Type, Result = r}; 
}
returnquery.SelectMany(c=>c.fully())
.ToLookup(res=>res.Type,res=>res.Value);
...
//您需要自己创建子句填充类型
公共IEnumerable()函数
{
var results=//无论什么都可以实现
foreach(结果中的var r)
返回新子句{Type=Type,Result=r};
}

我不太清楚你为什么要把字典放在第一位。这对你有用吗

return query.ToLookup(clause => clause.Type, clause => FullFillClause(clause));
它不符合
ILookup
界面,但也不符合您提供的代码,因此我无法确定您实际想要什么

在重读问题之后,这里是一个尝试:

return query.SelectMany(c => FulfillClause(c).Select(r => new {Type=c.Type, Result=r}))
            .ToLookup(o => o.Type, o => o.Result);
这是@JonSkeet链接答案的翻译

为了在不了解所有类型和方法的详细信息的情况下进行测试,我使用了以下方法:

Func<List<int>> f = () => new List<int>() {1, 2, 3};
var query = new List<Type> {typeof (int), typeof (string)};

var l = query.SelectMany(t => f().Select(n => new {Type = t, Result = n}))
    .ToLookup(o => o.Type, o => o.Result);
Func f=()=>newlist(){1,2,3};
var query=新列表{typeof(int),typeof(string)};
var l=query.SelectMany(t=>f().Select(n=>new{Type=t,Result=n}))
.ToLookup(o=>o.Type,o=>o.Result);

如果您控制了所有代码,则可以对其中一些代码进行重组以增强可读性:

return query.SelectMany(c => c.Fulfill())
            .ToLookup(res => res.Type, res => res.Value);

...
// You will need to create the ClauseFulfillment type yourself
public IEnumerable<ClauseFulfillment> FulFill()
{
   var results = // whatever FulfillClause does
   foreach(var r in results)
      yield return new ClauseFulfillment {Type = Type, Result = r}; 
}
returnquery.SelectMany(c=>c.fully())
.ToLookup(res=>res.Type,res=>res.Value);
...
//您需要自己创建子句填充类型
公共IEnumerable()函数
{
var results=//无论什么都可以实现
foreach(结果中的var r)
返回新子句{Type=Type,Result=r};
}

您的代码似乎没有使用
收益回报率
,因此很难看出这有什么关系。。。您还没有告诉我们有关
query
FulfillClause
的任何信息。我想替换结果。添加带有收益回报的行,但是,这是不可能的,因为C不支持ILookup的收益回报(仅IEnumerable)。您的代码似乎没有使用
收益回报
,所以很难看出这有什么关系。。。您还没有告诉我们有关
query
FulfillClause
的任何信息。我想替换结果。添加带有收益回报的行,但是,这是不可能的,因为C不支持ILookup的收益回报(仅IEnumerable),为什么我的代码不符合ILookup接口?根据链接线程中给出的字典和ToLookup扩展方法,我完成了接口。请查看链接线程,谢谢。它展示了一种将字典转换为查找的扩展方法。感谢您的努力+1.然而,我不确定新代码是否真的比我最初的努力更具可读性。无论如何谢谢你。我希望C#能让我做一些收益回报的事情:-)@D.R.--不客气!如果你控制了所有的代码,我已经更新了我的答案。为什么我的代码不符合ILookup接口?根据链接线程中给出的字典和ToLookup扩展方法,我完成了接口。请查看链接线程,谢谢。它展示了一种将字典转换为查找的扩展方法。感谢您的努力+1.然而,我不确定新代码是否真的比我最初的努力更具可读性。无论如何谢谢你。我希望C#能让我做一些收益回报的事情:-)@D.R.--不客气!如果你控制了所有的代码,我已经更新了我的答案。