IEnumerable Count()和之间的主要区别是Length什么?
我花了好几个小时思考暴露名单成员的主题.在与我的类似问题中,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) 我碰巧看到了一些代码,其中这个人将lambda表达式传递给ArrayList.Sort(这里是IComparer)或IEnumerable.SequenceEqual(IEnumerable列表,IEqualityComparer here),其中需要IComparer或IEqualityComparer.
我不能确定我是否看过它,或者我只是在做梦.我似乎无法在这些集合中找到任何接受Func <>或其方法签名中的委托的扩展.
有这样的过载/扩展方法吗?或者,如果没有,是否有可能像这样捣乱并传递一个算法(读委托),其中预期单方法接口?
更新 谢谢大家.那正是我所想.我一定是在做梦.我知道如何编写转换.我只是不确定我是否见过这样的东西,或者只是觉得我已经看过了.
又一次更新 看,在这里,我找到了一个这样的实例.毕竟我并没有做梦.看看这家伙在这做什么.是什么赋予了?
这是另一个更新:
好的,我明白了.那家伙正在使用Comparison<T>超载.尼斯.很好,但完全容易误导你.不过很好.谢谢.
linq ienumerable extension-methods icomparer iequalitycomparer
是否有相当于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 ,因为它遍历所有成员,而不仅仅是值.
基本上我想尝试做这样的事情:
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图层的属性.
可能重复:
Scala中的LINQ类似物
我正在寻找图表,它显示了IEnumerable的LINQ方法的Scala中的等价物:
有谁知道这样的"翻译"表吗?
我有两个枚举:IEnumerable<A> list1和IEnumerable<B> list2.我想同时迭代它们,如:
foreach((a, b) in (list1, list2))
{
// use a and b
}
Run Code Online (Sandbox Code Playgroud)
如果它们不包含相同数量的元素,则应抛出异常.
做这个的最好方式是什么?
这就是我想要做的.我正在使用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) 我注意到在编写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) 快速刷新.
什么时候:
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) ienumerable ×10
c# ×8
.net ×3
linq ×3
list ×2
any ×1
asp.net-mvc ×1
c#-3.0 ×1
distinct ×1
foreach ×1
icomparer ×1
iterable ×1
iteration ×1
javascript ×1
jquery ×1
linq-to-xml ×1
razor-3 ×1
scala ×1