【问题标题】:how to convert an object to IEnumerable of that object [closed]如何将对象转换为该对象的 IEnumerable [关闭]
【发布时间】:2016-03-24 14:42:54
【问题描述】:

我有一个函数返回一个 Person 类型的对象。

现在,我需要调用另一个接受IEnumerable<Person> 类型的函数。请问怎么做?

下面的这个函数返回我的人。

var objA = Service.GetAll(obj);

我需要调用另一个方法如下

var result = Service.Get(AR<IEnumerable<Person>> name, type)

我将名称指定为IEnumerable&lt;Person&gt;,因为它采用该类型。

编辑

我的第二种方法将这个作为参数类型。

AR<IEnumerable<Person>>

在所有其他地方,我的第一个方法返回AR&lt;Ienumerable&lt;person&gt;&gt;,但在一种情况下它返回AR&lt;Person&gt;。现在我需要将它作为一个列表,即AR&lt;IEnumerable&lt;Person&gt;&gt;,以便我可以按原样使用第二种方法

【问题讨论】:

  • 你的意思是你想把那个人传递给一个接受IEnumerable&lt;Person&gt;作为参数的方法吗? var p = f1(); 然后打电话给f2(new Person[] { p }); 这是你要找的吗?
  • @RezaAghaei: 不,我正在寻找像 IEnumerable 这样的东西应该作为参数传递给第二个函数,而我在第一个函数中将 Person 作为返回值
  • 我对这个问题持怀疑态度。 var objA = Service.GetAll(obj); 的名字很糟糕。你说它返回一个Person?那么,它是GetAll 什么?人?那闻起来你确定你的类型是你所说的那样。从你的cmets的语气来看,我怀疑不是。让我们看看更多代码,您从编译器看到的特定错误,以及您从上面提供的代码调用的所有代码的接口/方法声明.
  • 没有人知道如何构造AgentResult&lt;T&gt;。很明显,您在那些可以帮助您的人的脚下省略细节并更改“简单要求”,这是在浪费人们的时间。直截了当地提出您的问题,并在正确形成时提出。
  • @Deevinee 自提出这个误导性问题以来,您已经完全 3 次更改了方法中的类型。很难不认为这是浪费时间。

标签: c# asp.net .net c#-4.0


【解决方案1】:

在这些罕见的情况下,我使用这样的扩展方法:

public static IEnumerable<T> YieldMe<T>(this T obj)
{
    yield return obj;
}

【讨论】:

  • 该死的,它说找不到命名空间 T 的类型你是否缺少程序集 ref :S
  • 展示你做了什么。
  • @Deevinee T 是一个泛型,因此您可以将其替换为您的对象 Person
  • @Deevinee 你能检查一下标题中的 using 部分,并确保你有 using System.Collections; and using System.Collections.Generic; 还显示你是如何调用扩展方法的
  • @Deevinee,似乎我们应该这样做,因为如果没有它,这里发布的每个答案都会起作用,如果你首先发布它,你会更快地得到答案。
【解决方案2】:

只要use

Enumerable.Repeat(objA, 1);

Repeat 准确返回您需要的内容。

【讨论】:

  • @Deevinee Repeat returns 正是您所需要的
  • 伙伴,怎么用?
  • 它正在抛出编译时错误伙伴
【解决方案3】:

我正在寻找类似 IEnumerable&lt;Person&gt; 的东西应该通过 作为第二个函数的参数,而我将 Person 作为返回值 在第一个函数中

所以你可以使用这样的代码:

/*while I get Person as return value in first function*/
Person p = FirstMethod(); 

/*IEnumerable<Person> should be passed as a parameter to second function*/
SecondMethod(new Person[] { p }); 

而第二个方法签名可能是void SecondMethod(IEnumerable&lt;Person&gt; x)

【讨论】:

  • 对不起,您的第一行本身会引发错误
  • 这个答案怎么会被否决?虽然它确实符合您的描述?
  • Reza,对不起,我没有投反对票。事实上,你试图帮助我。真的我没有投反对票,但不幸的是这段代码没有帮助
  • @RezaAghaei - 因为 OP 正在对他的问题进行实质性更改,所以它被否决了。新读者认为我们的答案完全是错误的,因为编辑。
  • @Enigmativity 无论如何,感谢您的友好评论和 +1 对您的回答破坏了不合理的反对票的影响 :)
【解决方案4】:

一个简单的方法是从:

public Person GetPerson()
{
    return new Person()
}

并添加:

public IEnumerable<Person> GetPeople()
{
    return new [] { GetPerson() };
}

【讨论】:

  • 单项数组的钝器可能是这里最好的答案。相比之下,使用yield 创建状态机来回答这个问题似乎有些冗长。
  • 没有帮助我。我的要求很简单,它应该将 AgentResult> 作为第二个函数的输入,而我将 Person 作为第一个函数的输出。
  • @Deevinee - 我回答了你的问题。您现在已经编辑了您的问题。请注意这一点。我会看看我是否可以更新,但如果您希望得到好的答案,您需要发布 minimal reproducible example
  • @Enigmativity: 好的,请帮助它简单我需要 AR> 来自 AR
  • @Deevinee - 我们不知道AR&lt;&gt; 是什么。我们怎么可能知道如何提取内部类型?您需要发布minimal reproducible example。你读过那个页面了吗?
【解决方案5】:

您可以创建List&lt;Person&gt; 的新实例,因为List&lt;T&gt; 实现了IEnumerablehttps://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

所以:

var person = FunctionThatGetsPerson();
List<Person> personList = new List<Person> { person };
FunctionThatTakesEnumerable(personList);

public void FunctionThatTakesEnumerable(IEnumerable<Person> personList)
{ 
    //
}

【讨论】:

  • 你的似乎很简单,但它说它在个人列表行中有无效的参数
  • person对象是Person的类型吗?
  • 只创建一个内联数组不是更好吗? FunctionThatTakesEnumerable(new Person[] {person} );
  • @Puddler 我的意思是这基本上是我在额外的行中所做的,但使用的是泛型。
  • 新列表是一个新对象。新对象是新资源。此外,即使您通过简单类型转换将 IEnumerable 放入方法,也可以修改 List。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多