我正在尝试使用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列表中的每个项目并将唯一值添加到列表中.
任何帮助创建一个优雅的解决方案将非常感谢!
我经常想要抓住IEnumerable<T>.net中的第一个元素,我还没有找到一个很好的方法来做到这一点.我提出的最好的是:
foreach(Elem e in enumerable) {
// do something with e
break;
}
Run Code Online (Sandbox Code Playgroud)
呸!那么,有一个很好的方法来做到这一点?
C#中的这些行
decimal a = 2m;
decimal b = 2.0m;
decimal c = 2.00000000m;
decimal d = 2.000000000000000000000000000m;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Run Code Online (Sandbox Code Playgroud)
生成此输出:
2
2.0
2.00000000
2.000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
所以我可以看到从文字中创建一个十进制变量允许我控制精度.
给定项目集合,如何根据谓词将集合拆分为2个子集合?
您可以进行2次搜索,但运行时间为2*N(虽然仍为O(n),但需要两倍的时间,显然不是首选)
IEnumerable<int> even = nums.Where(i => IsEven(i));
IEnumerable<int> odd = nums.Where(i => !IsEven(i));
Run Code Online (Sandbox Code Playgroud)
你可以自己做一个线性传递(在这里重构为扩展方法),但这意味着你必须全部拖动这些代码,而更多的自定义代码使得事情的可维护性降低.
public static void SplitOnPred<T>(
this IEnumerable<T> collection,
Func<T, bool> pred,
out IEnumerable<T> trueSet,
out IEnumerable<T> falseSet
) {
List<T> trueSetList = new List<T>();
List<T> falseSetList = new List<T>();
foreach( T item in collection ) {
if( pred( item ) ) {
trueSetList.Add( item );
} else {
falseSetList.Add( item );
}
}
trueSet = trueSetList;
falseSet = falseSetList;
}
Run Code Online (Sandbox Code Playgroud)
问题: LINQ是否有任何原生支持在1个线性传递中拆分集合?
------ Clean started: Project: DataService, Configuration: Debug Any CPU ------
O/R Designer validation failed for file: a.dbml
O/R Designer validation failed for file: b.dbml
O/R Designer validation failed for file: c.dbml
O/R Designer validation failed for file: d.dbml
O/R Designer validation failed for file: e.dbml
O/R Designer validation failed for file: f.dbml
Error: The operation could not be completed. Unspecified error
Run Code Online (Sandbox Code Playgroud)
此错误是间歇性的.有时清洁很好,有时会发生这种情况.
我正在运行VS2008版本9.0.30729.1 SP - 64位.
有什么方法可以禁用O/R设计师的验证或以其他方式阻止它发生?
我正试图在LINQ中查明特定州的员工数量.
我有这样的事情:
States
|
Cities
|
Posts
|
Employees
Run Code Online (Sandbox Code Playgroud)
如何Employees通过State手头选择计数?
我的实体是:
public class Province : EntityBase
{
public String ProvinceName { get; set; }
public virtual IList<City> Cities { get; set; }
}
public class City : EntityBase
{
public String CityName { get; set; }
public virtual Province Province { get; set; }
public virtual IList<Post> ElectricPosts { get; set; }
}
public class Post : EntityBase
{
public String PostName { get; set; } …Run Code Online (Sandbox Code Playgroud) 我认为编译的查询将执行与DataContext相同的查询转换.然而,当我尝试使用带有.Contains方法调用的查询时,我遇到了运行时错误.我哪里出错了?
//private member which holds a compiled query.
Func<DataAccess.DataClasses1DataContext, List<int>, List<DataAccess.TestRecord>>
compiledFiftyRecordQuery = System.Data.Linq.CompiledQuery.Compile
<DataAccess.DataClasses1DataContext, List<int>, List<DataAccess.TestRecord>>
((dc, ids) => dc.TestRecords.Where(tr => ids.Contains(tr.ID)).ToList());
//this method calls the compiled query.
public void FiftyRecordCompiledQueryByID()
{
List<int> IDs = GetRandomInts(50);
//System.NotSupportedException
//{"Parameters cannot be sequences."}
List<DataAccess.TestRecord> results = compiledFiftyRecordQuery
(myContext, IDs);
}
Run Code Online (Sandbox Code Playgroud) 我有两种方法(在C#中):
List<Pizza> CookPizza(List<Order>);
List<HappyCustomers> DeliverPizza(List<Pizza>);
Run Code Online (Sandbox Code Playgroud)
这些操作没有共同的对象(除了从一个传递到另一个的比萨),并且是线程安全的.它们每个都需要几秒钟才能执行,它们每个都使用不同的资源(烤箱与汽车).因此,我想同时运行它们.
如何使用这些约束组织线程:
我知道一开始的所有订单(比方说,我有10万个订单).一个订单可以包含多个比萨饼,我不知道在比萨饼煮熟之前,任何订单中都有多少比萨饼.(我知道很奇怪).一般来说,订单有1个披萨,但最多可以有10个.
活跃的比萨饼的数量一般不应超过100.这包括新鲜煮熟的比萨饼和交付的比萨饼.这是一个软限制,所以我可以超过一些(例如,当一个大订单煮熟时).硬限制可能接近500.
当他们获得大量工作时,这两项操作都会更有效率.通常,CookPizza在给出至少20个订单时效率最高.如果给予至少50个比萨饼,提供比萨饼是最有效的.也就是说,如果我给这些方法的项目少于那些数量,我会看到性能下降.如果剩下这些,那么使用更少的物品就可以了.
我正在解决的主要问题是这些方法可能需要相互等待.
我们最近已升级到VS2010(10.0.40219.1 SP1Rel)和ILOG规则.net 7.1.1.4(x64).现在可以发生以下情况:
这种情况发生在大型解决方案中(大约60个csproj,约15个规则).这种情况发生在较小的解决方案中(6个csproj,1个规则).
我们已经开始采取极端开发措施来避免引用丢失(在调试时卸载所有规则,并在调试后关闭/重新打开VS2010).
我们的项目或软件设置中有什么东西可以改变以阻止项目引用下降吗?
更新:虽然使用调试器是一种可靠的方法来解决"重构规则/引用丢弃"问题,但偶尔也只是通过关闭文件而不使用调试器.
我已经获得了第一笔赏金,如果有人想出一个可以接受的答案,我愿意设立第二笔赏金.
解决方法:我们有三个解决方案文件
开发人员可以安全地调试第三个解决方案,该解决方案没有用于VS的规则文件.
我有一个映射在datacontext中的表.这是感兴趣的列的属性和属性:
[Column(Storage="_CustomerNumber", DbType="VarChar(25)")]
public string CustomerNumber
{
Run Code Online (Sandbox Code Playgroud)
实际上,该列是varchar(25)并具有索引.
我有一些简单的代码:
DataClasses1DataContext myDC = new DataClasses1DataContext();
myDC.Log = Console.Out;
List<string> myList = new List<string>() { "111", "222", "333" };
myDC.Customers
.Where(c => myList.Contains(c.CustomerNumber))
.ToList();
Run Code Online (Sandbox Code Playgroud)
哪个生成此SQL文本:
SELECT [t0].[CustomerNumber], [t0].[CustomerName]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerNumber] IN (@p0, @p1, @p2)
-- @p0: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [111]
-- @p1: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [222]
-- @p2: Input NVarChar (Size = …Run Code Online (Sandbox Code Playgroud)