标签: ienumerable

IEnumerable Count()和Length之间的差异

IEnumerable Count()和之间的主要区别是Length什么?

.net c# ienumerable

60
推荐指数
2
解决办法
8万
查看次数

IEnumerable vs IReadonlyCollection vs ReadonlyCollection用于公开列表成员

我花了好几个小时思考暴露名单成员的主题.在与我的类似问题中,John Skeet给出了一个很好的答案.请随便看看.

ReadOnlyCollection或IEnumerable用于公开成员集合?

我通常非常偏执暴露列表,特别是如果您正在开发API.

我一直使用IEnumerable来公开列表,因为它非常安全,而且它提供了很大的灵活性.我在这里举一个例子

public class Activity
{
    private readonly IList<WorkItem> workItems = new List<WorkItem>();

    public string Name { get; set; }

    public IEnumerable<WorkItem> WorkItems
    {
        get
        {
            return this.workItems;
        }
    }

    public void AddWorkItem(WorkItem workItem)
    {
        this.workItems.Add(workItem);
    }
}
Run Code Online (Sandbox Code Playgroud)

任何针对IEnumerable进行编码的人都非常安全.如果我后来决定使用有序列表或其他东西,它们的代码都没有中断,它仍然很好.这样做的缺点是IEnumerable可以被强制转换回这个类之外的列表.

出于这个原因,许多开发人员使用ReadOnlyCollection来公开成员.这是非常安全的,因为它永远不会被强制转换为列表.对我来说,我更喜欢IEnumerable,因为它提供了更大的灵活性,我是否想要实现与列表不同的东西.

我想出了一个我更喜欢的新想法.使用IReadOnlyCollection

public class Activity
{
    private readonly IList<WorkItem> workItems = new List<WorkItem>();

    public string Name { get; set; }

    public IReadOnlyCollection<WorkItem> WorkItems
    {
        get
        {
            return new ReadOnlyCollection<WorkItem>(this.workItems);
        }
    }

    public void AddWorkItem(WorkItem workItem)
    {
        this.workItems.Add(workItem);
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# ienumerable encapsulation list

59
推荐指数
4
解决办法
3万
查看次数

传递lambda表达式代替IComparer或IEqualityComparer或任何单方法接口?

我碰巧看到了一些代码,其中这个人将lambda表达式传递给ArrayList.Sort(这里是IComparer)或IEnumerable.SequenceEqual(IEnumerable列表,IEqualityComparer here),其中需要IComparer或IEqualityComparer.

我不能确定我是否看过它,或者我只是在做梦.我似乎无法在这些集合中找到任何接受Func <>或其方法签名中的委托的扩展.

有这样的过载/扩展方法吗?或者,如果没有,是否有可能像这样捣乱并传递一个算法(读委托),其中预期单方法接口?

更新 谢谢大家.那正是我所想.我一定是在做梦.我知道如何编写转换.我只是不确定我是否见过这样的东西,或者只是觉得我已经看过了.

又一次更新 看,在这里,我找到了一个这样的实例.毕竟我并没有做梦.看看这家伙这做什么.是什么赋予了?

这是另一个更新: 好的,我明白了.那家伙正在使用Comparison<T>超载.尼斯.很好,但完全容易误导你.不过很好.谢谢.

linq ienumerable extension-methods icomparer iequalitycomparer

56
推荐指数
6
解决办法
4万
查看次数

JavaScript/jQuery相当于LINQ Any()

是否有相当于IEnumerable.Any(Predicate<T>)JavaScript或jQuery?

我正在验证项目列表,并希望在检测到错误时提前中断.我可以使用它$.each,但我需要使用外部标志来查看该项是否实际找到:

var found = false;
$.each(array, function(i) {
    if (notValid(array[i])) {
        found = true;
    }
    return !found;
});
Run Code Online (Sandbox Code Playgroud)

什么是更好的方式?我不喜欢for在JavaScript数组中使用plain ,因为它遍历所有成员,而不仅仅是值.

javascript ienumerable foreach jquery any

56
推荐指数
3
解决办法
2万
查看次数

是否有Linq方法将单个项添加到IEnumerable <T>?

基本上我想尝试做这样的事情:

image.Layers
Run Code Online (Sandbox Code Playgroud)

除了图层之外的所有图层都返回IEnumerable Parent,但在某些情况下,我只想这样做:

image.Layers.With(image.ParentLayer);
Run Code Online (Sandbox Code Playgroud)

因为它只在少数几个地方使用,相比之下,通常使用的100s image.Layers.这就是为什么我不想创建另一个也返回Parent图层的属性.

.net c# ienumerable

54
推荐指数
7
解决办法
2万
查看次数

Scala中IEnumerable LINQ等价物的图表?

可能重复:
Scala中的LINQ类似物

我正在寻找图表,它显示了IEnumerable的LINQ方法的Scala中的等价物:

  • 首先是头
  • 选择是地图
  • SingleOrDefault是......(我不知道)
  • ... 等等

有谁知道这样的"翻译"表吗?

c# linq ienumerable iterable scala

54
推荐指数
1
解决办法
9000
查看次数

如何同时迭代两个IEnumerables?

我有两个枚举:IEnumerable<A> list1IEnumerable<B> list2.我想同时迭代它们,如:

foreach((a, b) in (list1, list2))
{
    // use a and b
}
Run Code Online (Sandbox Code Playgroud)

如果它们不包含相同数量的元素,则应抛出异常.

做这个的最好方式是什么?

c# iteration ienumerable

53
推荐指数
4
解决办法
1万
查看次数

C#与IEnumerable <T>的区别在于自定义IEqualityComparer

这就是我想要做的.我正在使用LINQ to XML查询XML文件,它为我提供了一个IEnumerable <T>对象,其中T是我的"Village"类,填充了此查询的结果.有些结果是重复的,所以我想在IEnumerable对象上执行Distinct(),如下所示:

public IEnumerable<Village> GetAllAlliances()
{
    try
    {
        IEnumerable<Village> alliances =
             from alliance in xmlDoc.Elements("Village")
             where alliance.Element("AllianceName").Value != String.Empty
             orderby alliance.Element("AllianceName").Value
             select new Village
             {
                 AllianceName = alliance.Element("AllianceName").Value
             };

        // TODO: make it work...
        return alliances.Distinct(new AllianceComparer());
    }
    catch (Exception ex)
    {
        throw new Exception("GetAllAlliances", ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于默认的比较器不适用于Village对象,我实现了一个自定义的比较器,如AllianceComparer类中所示:

public class AllianceComparer : IEqualityComparer<Village>
{
    #region IEqualityComparer<Village> Members
    bool IEqualityComparer<Village>.Equals(Village x, Village y)
    {
        // Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable distinct linq-to-xml

52
推荐指数
3
解决办法
4万
查看次数

为什么IList <T>上的.ForEach()而不是IEnumerable <T>?

可能重复:
为什么IEnumerable接口上没有ForEach扩展方法?

我注意到在编写LINQ-y代码时,.ForEach()是一个很好用的习惯用法.例如,这是一段代码,它接受以下输入,并产生这些输出:

{ "One" } => "One"
{ "One", "Two" } => "One, Two"
{ "One", "Two", "Three", "Four" } => "One, Two, Three and Four";
Run Code Online (Sandbox Code Playgroud)

和代码:

private string InsertCommasAttempt(IEnumerable<string> words)
{
    List<string> wordList = words.ToList();
    StringBuilder sb = new StringBuilder();
    var wordsAndSeparators = wordList.Select((string word, int pos) =>
        {
            if (pos == 0) return new { Word = word, Leading = string.Empty };
            if (pos == wordList.Count - 1) return new { Word = word, Leading = " …
Run Code Online (Sandbox Code Playgroud)

c# linq ienumerable list c#-3.0

52
推荐指数
3
解决办法
3万
查看次数

在ASP.NET MVC中使用自定义编辑器模板和IEnumerable模型的正确,惯用方法

这个问题是为什么我的DisplayFor没有遍历我的IEnumerable <DateTime>的后续行动


快速刷新.

什么时候:

  • 该模型具有类型的属性 IEnumerable<T>
  • 您将此属性传递给Html.EditorFor()使用仅接受lambda表达式的重载
  • T在Views/Shared/EditorTemplates下有一个类型的编辑器模板

然后MVC引擎将自动为可枚举序列中的每个项调用编辑器模板,生成结果列表.

例如,当存在Order具有属性的模型类时Lines:

public class Order
{
    public IEnumerable<OrderLine> Lines { get; set; }
}

public class OrderLine
{
    public string Prop1 { get; set; }
    public int Prop2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并且有一个视图Views/Shared/EditorTemplates/OrderLine.cshtml:

@model TestEditorFor.Models.OrderLine

@Html.EditorFor(m => m.Prop1)
@Html.EditorFor(m => m.Prop2)
Run Code Online (Sandbox Code Playgroud)

然后,当您@Html.EditorFor(m => m.Lines)从顶级视图调用时,您将获得一个页面,其中包含每个订单行的文本框,而不仅仅是一个.


但是,正如您在链接问题中看到的那样,这仅在您使用特定的重载时才有效EditorFor.如果您提供模板名称(为了使用未在OrderLine类之后命名的模板),则不会发生自动序列处理,而是会发生运行时错误.

此时,您必须将自定义模板的模型声明为IEnumebrable<OrderLine>并以某种方式手动迭代其项目以输出所有这些项目,例如

@foreach (var line in Model.Lines) {
    @Html.EditorFor(m …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc ienumerable view-templates razor-3

50
推荐指数
1
解决办法
2万
查看次数