是的,所以我有一个可枚举的,并希望从中获得不同的值.
使用System.Linq
,当然有一个名为的扩展方法Distinct
.在简单的情况下,它可以在没有参数的情况下使用,例如:
var distinctValues = myStringList.Distinct();
Run Code Online (Sandbox Code Playgroud)
好的,但如果我有一个可以指定相等性的可枚举对象,唯一可用的重载是:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
Run Code Online (Sandbox Code Playgroud)
equality comparer参数必须是.的实例IEqualityComparer<T>
.当然,我可以做到这一点,但它有点冗长,而且很有说服力.
我所期望的是一个需要lambda的重载,比如Func <T,T,bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Run Code Online (Sandbox Code Playgroud)
任何人都知道是否存在某些此类扩展或某些等效的解决方法?或者我错过了什么?
或者,有没有一种方法可以指定IEqualityComparer内联(embarass me)?
更新
我找到了Anders Hejlsberg对MSDN论坛中关于这个主题的帖子的回复.他说:
您将遇到的问题是,当两个对象比较相等时,它们必须具有相同的GetHashCode返回值(否则Distinct内部使用的哈希表将无法正常运行).我们使用IEqualityComparer,因为它将Equals和GetHashCode的兼容实现打包到一个接口中.
我认为那是有道理的..
我正在研究WPF,C#3.0项目,我收到此错误:
Error 1 Metadata file
'WORK=- \Tools\VersionManagementSystem\BusinessLogicLayer\bin\Debug
\BusinessLogicLayer.dll' could not be found C:\-=WORK=- \Tools
\VersionManagementSystem\VersionManagementSystem\CSC VersionManagementSystem
Run Code Online (Sandbox Code Playgroud)
这是我引用我的usercontrols的方式:
xmlns:vms="clr-namespace:VersionManagementSystem"
<vms:SignOffProjectListing Margin="5"/>
Run Code Online (Sandbox Code Playgroud)
它发生在每次失败的构建之后.我可以获得编译解决方案的唯一方法是注释掉我的所有用户控件并重新构建项目,然后我取消注释用户控件,一切都很好.
我检查了构建顺序和依赖项配置.
正如你所看到的,它似乎已经截断了DLL文件的绝对路径......我已经读过有一个长度错误.这可能是个问题吗?
它非常烦人,不得不评论,构建和取消注释,构建变得非常烦人.
使用反射,如何使用最少的代码获得使用C#3.0/.NET 3.5实现接口的所有类型,并最大限度地减少迭代?
这就是我想要重写的内容:
foreach (Type t in this.GetType().Assembly.GetTypes())
if (t is IMyInterface)
; //do stuff
Run Code Online (Sandbox Code Playgroud) 我正在做一些小事情,我想弄清楚我是否可以从字符串加载XDocument.XDocument.Load()
似乎将传递给它的字符串作为物理XML文件的路径.
我想尝试绕过首先必须创建物理XML文件的步骤,然后直接跳转到填充XDocument.
有任何想法吗?
给定像这样的数据源:
var c = new Car[]
{
new Car{ Color="Blue", Price=28000},
new Car{ Color="Red", Price=54000},
new Car{ Color="Pink", Price=9999},
// ..
};
Run Code Online (Sandbox Code Playgroud)
如何用LINQ 找到满足一定条件的第一辆车的索引?
编辑:
我可以想到这样的东西,但它看起来很糟糕:
int firstItem = someItems.Select((item, index) => new
{
ItemName = item.Color,
Position = index
}).Where(i => i.ItemName == "purple")
.First()
.Position;
Run Code Online (Sandbox Code Playgroud)
用一个普通的循环解决这个问题会是最好的吗?
我已经快速阅读了Microsoft Lambda Expression文档.
这种例子帮助我更好地理解了:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
Run Code Online (Sandbox Code Playgroud)
不过,我不明白为什么会有这样的创新.它只是一种在"方法变量"结束时死亡的方法,对吗?为什么我应该使用它而不是真正的方法?
背景:在接下来的一个月里,我将进行三次谈话,或者至少包括LINQ
在上下文中C#
.我想知道哪些主题值得给予相当多的关注,基于人们可能会发现难以理解的内容,或者他们可能会错误地认为什么.我不会特别谈论LINQ
到SQL
或实体框架除了作为如何查询可以远程使用表达式树(通常被执行的例子IQueryable
).
那么,你发现了LINQ
什么?你在误解方面看到了什么?示例可能是以下任何一种,但请不要限制自己!
C#
编译器如何处理查询表达式IQueryable
这些天有很多关于单子的讨论.我已经阅读了一些文章/博客文章,但我不能用他们的例子来完全掌握这个概念.原因是monad是一个函数式语言概念,因此这些例子都是我没有使用过的语言(因为我没有深入使用过函数式语言).我无法深入掌握语法以完全遵循这些文章......但我可以告诉它有一些值得理解的东西.
但是,我非常了解C#,包括lambda表达式和其他功能特性.我知道C#只有一部分功能特性,所以monad不能用C#表示.
但是,肯定有可能传达这个概念吗?至少我希望如此.也许您可以将C#示例作为基础,然后描述C#开发人员希望他可以从那里做什么,但不能,因为该语言缺乏函数式编程功能.这太棒了,因为它会传达monad的意图和好处.所以这就是我的问题:你可以给一个C#3开发人员提供monad的最佳解释是什么?
谢谢!
(编辑:顺便说一下,我知道SO上至少有3个"什么是monad"问题.然而,我遇到了同样的问题......所以这个问题需要imo,因为C#-developer焦点.谢谢.)
我正在尝试使用Linq返回一个id列表,给出id为属性的对象列表.我希望能够在不循环遍历每个对象并拉出我找到的唯一ID的情况下执行此操作.
我有一个MyClass类型的对象列表,这个类的一个属性是一个ID.
public class MyClass
{
public int ID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是写一个Linq查询来返回我的那些ID列表
IList<MyClass>
如果它返回一个IEnumerable<int>
id ,我该怎么做呢?
我确信必须能够使用Linq在一行或两行中完成它,而不是循环遍历MyClass列表中的每个项目并将唯一值添加到列表中.
任何帮助创建一个优雅的解决方案将非常感谢!
我正在寻找实现通用方法的好主意,让一行(或匿名委托)代码执行超时.
TemperamentalClass tc = new TemperamentalClass();
tc.DoSomething(); // normally runs in 30 sec. Want to error at 1 min
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个可以在我的代码与气质代码交互的许多地方(我无法改变)优雅地实现的解决方案.
另外,如果可能的话,我想让违规的"超时"代码停止执行.
c#-3.0 ×10
c# ×9
lambda ×4
linq ×3
.net ×2
asynchronous ×1
class ×1
linq-to-xml ×1
list ×1
monads ×1
optimization ×1
properties ×1
reflection ×1
timeout ×1
wpf ×1
xml ×1