如何从通过.ToLookup()方法创建的Lookup <>获取密钥集合?
我有一个查找,它将int值映射到自定义类的实例组.我需要查找包含的所有int键的集合.有什么方法可以做到这一点,还是我必须单独收集和保存它们?
我们正在实现一些EF数据存储库,我们有一些查询包括 TOP 1
我已经阅读了许多建议使用.Take(1)
我正在审查的代码使用的帖子.First()
我知道这两个都会为对象赋值产生相同的结果,但它们是否实际上都解析为同一个查询?查询数据库时,它实际上是否同时TOP 1用于两个请求?或者他们会将查询完整地执行到可枚举中,然后只需获取集合中的第一个条目?
此外,如果我们使用.FirstOrDefault()那么为什么我们应该期待任何不同的行为?我知道,当使用一个IEnumerable,调用一个.First()在一个空的集合会抛出,但如果这是实际上只更改查询包括TOP 1话,我应该会完全没有功能上的差异之间.First()和.FirstOrDefault()....对不对?
或者,是否有比这些Enumerable扩展更好的方法来执行查询TOP 1?
从性能的角度来看,你应该使用"嵌套的foreach"或"lambda/linq查询"?
如果我想在ASP.NET页面上找到选中的复选框,我可以使用以下LINQ查询.
var checkBoxes = this.Controls
.OfType<CheckBox>()
.TakeWhile<CheckBox>(cb => cb.Checked);
Run Code Online (Sandbox Code Playgroud)
如果复选框嵌套在当前控件集合中,那么工作正常,但我想知道如何通过向下钻取到顶级控件的控件集合来扩展搜索.
这里问的问题是:
并且收到了非LINQ答案,我已经有自己的类型和ID作为扩展方法的递归控件搜索版本,但我只是想知道在LINQ中这样做有多容易?
我想在a中显示客户的会计历史记录DataGridView,我希望有一个列显示其余额的运行总计.我这样做的旧方法是获取数据,循环数据,逐行添加行DataGridView并计算当时的运行总数.瘸.我宁愿使用LINQ to SQL,或LINQ如果不能使用LINQ to SQL,来计算运行总数,这样我就可以设置DataGridView.DataSource为我的数据.
这是我正在拍摄的一个超级简化的例子.说我有以下课程.
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要一个可以生成如下结果的L2S或LINQ语句:
Date Amount RunningTotal
12-01-2009 5 5
12-02-2009 -5 0
12-02-2009 10 10
12-03-2009 5 15
12-04-2009 -15 0
Run Code Online (Sandbox Code Playgroud)
请注意,可能有多个具有相同日期的项目(12-02-2009).在计算运行总计之前,应按日期对结果进行排序.我猜这意味着我需要两个语句,一个用于获取数据并对其进行排序,另一个用于执行运行总计算.
我希望Aggregate能做到这一点,但它并不像我希望的那样有效.或者也许我只是想不出来.
这个问题似乎跟我想要的一样,但我不知道接受/唯一的答案是如何解决我的问题的.
关于如何解决这个问题的任何想法?
编辑 结合Alex和DOK的答案,这就是我最终得到的结果:
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new …Run Code Online (Sandbox Code Playgroud) 我没有Single在LINQ下面使用,但我仍然得到一个'Sequence contains no elements'异常:
allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0)
.Select((s) => s.Name)
.Aggregate((namesInfo, name) => namesInfo += ", " + name);
Run Code Online (Sandbox Code Playgroud)
如果没有以名称开头的库存,则会出现此异常'A'.
似乎一种扩展方法期望至少一个元素满足条件,但这不是预期的.
能否请您提出解决此问题的最佳解决方案?
提前致谢.
我有2个清单.1是产品的集合.另一个是商店里的产品系列.
如果名称与产品中的任何名称匹配,我需要能够返回所有shopProducts.
我有这个,但似乎没有用.有任何想法吗?
var products = shopProducts.Where(p => p.Name.Any(listOfProducts.
Select(l => l.Name).ToList())).ToList();
Run Code Online (Sandbox Code Playgroud)
我需要说给我所有其他名单中存在名称的商店产品.
我试图找到两个通用列表之间的区别,如下例所示.即使t1和t2包含相同的属性,它们也不是同一个对象,所以我需要实现IEqualityComparer.
这似乎与这个例子有关,但真正的类有几个其他属性,我也需要对其他一些类做同样的事情.
所以我想知道我是否正在重新发明轮子?
是否有更简单的方法来比较两个对象的所有属性?目前,我真的只需要处理包含简单类型的类,但是我会有一个比较器,它可以处理包含其他类实例的类.
void Main()
{
var t1 = new Sizes { Name = "Test" , Size = 1} ;
var t2 = new Sizes { Name = "Test" , Size = 1} ;
var list1 = new List<Sizes>();
var list2 = new List<Sizes>();
list1.Add(t1);
list2.Add(t2);
var differences = list2.Except(list1 , new SizesComparer());
// differences should be empty.
}
public class Sizes
{
public string Name { get; set; }
public int Size { get; set; }
}
public …Run Code Online (Sandbox Code Playgroud) 我有点惊讶地发现以下代码的结果,我只想从一系列int中删除所有3:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); // Oh noes! Returns { 1, 1, 2, 3 }
Run Code Online (Sandbox Code Playgroud)
为什么不跳过3?
我的下一个想法是,好吧,Except运算符可以解决这个问题:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.Except(i => i == 3); // Oh noes! Returns { 1, 2 }
Run Code Online (Sandbox Code Playgroud)
综上所述,
有人可以解释为什么SkipWhile不会跳过最后一个元素吗?任何人都可以建议我可以用什么LINQ运算符从上面的序列中删除'3'?
当我将整数数组转换为字符串数组时,我使用for循环以较长的方式进行,如下面的示例代码中所述.这有简写吗?
现有的问题和答案SO大约int[]到string(不string[]).所以他们没有帮助.
虽然我发现这个将一个int数组转换为一个String数组的答案,但该平台是Java而不是C#.同样的方法无法实现!
int[] intarray = { 198, 200, 354, 14, 540 };
Array.Sort(intarray);
string[] stringarray = { string.Empty, string.Empty, string.Empty, string.Empty, string.Empty};
for (int i = 0; i < intarray.Length; i++)
{
stringarray[i] = intarray[i].ToString();
}
Run Code Online (Sandbox Code Playgroud)