我有一个具有Nullable DateOfBirth属性的Person对象.有没有办法使用LINQ查询具有最早/最小DateOfBirth值的Person对象列表.
这是我开始的:
var firstBornDate = People.Min(p => p.DateOfBirth.GetValueOrDefault(DateTime.MaxValue));
Run Code Online (Sandbox Code Playgroud)
Null DateOfBirth值设置为DateTime.MaxValue,以便将它们排除在Min考虑范围之外(假设至少有一个具有指定的DOB).
但对我来说,所有这一切都是将firstBornDate设置为DateTime值.我想得到的是与之匹配的Person对象.我是否需要编写第二个查询:
var firstBorn = People.Single(p=> (p.DateOfBirth ?? DateTime.MaxValue) == firstBornDate);
Run Code Online (Sandbox Code Playgroud)
或者有更简洁的方法吗?
如果我有一个类似于以下的类:
public class Item
{
public int ClientID { get; set; }
public int ID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这些物品的集合......
List<Item> items = getItems();
Run Code Online (Sandbox Code Playgroud)
如何使用LINQ返回具有最高ID的单个"Item"对象?
如果我这样做:
items.Select(i => i.ID).Max();
Run Code Online (Sandbox Code Playgroud)
我只会得到最高的ID,当我真正想要返回的是具有最高ID的Item对象本身?我希望它返回一个"Item"对象,而不是int.
我在从NHibernate返回的IQueryable上使用LINQ,我需要在几个字段中选择具有最大值的行.
我简化了我坚持的一点点.我需要从表中选择一行,并在一个字段中使用最大值.
var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }
from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u
Run Code Online (Sandbox Code Playgroud)
这是不正确的,但我无法找到正确的表格.
顺便说一下,我实际上想要实现的是这样的:
var clientAddress = this.repository.GetAll()
.GroupBy(a => a)
.SelectMany(
g =>
g.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.AddressReference == g.Max(x => x.AddressReference) &&
a.StartDate == g.Max(x => x.StartDate)))
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
我从上面的lambda开始,但我一直在使用LINQPad来尝试找出选择Max()的语法.
UPDATE
删除GroupBy是关键.
var all = this.repository.GetAll();
var …Run Code Online (Sandbox Code Playgroud) 我知道这可能是微优化,但我仍然不知道使用中是否有任何差异
var lastObject = myList.OrderBy(item => item.Created).Last();
Run Code Online (Sandbox Code Playgroud)
要么
var lastObject = myList.OrderByDescending(item => item.Created).First();
Run Code Online (Sandbox Code Playgroud)
我正在寻找Linq对象和Linq to Entities的答案.
我想在数组中找到模式.我知道我必须做嵌套循环来检查每个值,看看数组中的元素出现的频率.然后我必须计算第二个元素出现的次数.下面的代码不起作用,任何人都可以帮助我.
for (int i = 0; i < x.length; i ++)
{
x[i]++;
int high = 0;
for (int i = 0; i < x.length; i++)
{
if (x[i] > high)
high = x[i];
}
}
Run Code Online (Sandbox Code Playgroud) 例如,我有一个字符串:
"abbbbccd"
Run Code Online (Sandbox Code Playgroud)
b发生次数最多.使用C++时,处理此问题的最简单方法是将每个字符插入到map<>.我是否必须在C#中做同样的事情?使用LINQ有一种优雅的方式吗?
我有一个带有这个定义的类TaskWeekUI:
public class TaskWeekUI {
public Guid TaskWeekId { get; set; }
public Guid TaskId { get; set; }
public Guid WeekId { get; set; }
public DateTime EndDate { get; set; }
public string PersianEndDate { get; set; }
public double PlanProgress { get; set; }
public double ActualProgress { get; set; } }
Run Code Online (Sandbox Code Playgroud)
我写了这个查询:
TaskWeekUI ti = tis.First( t => t.PlanProgress > 0 && t.EndDate == tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate));
Run Code Online (Sandbox Code Playgroud)
这个查询是真的吗?我能比这更好地写出我的查询吗?
通常,要找到具有最大值属性的元素,我喜欢这样
var itemWithMaxPropValue = collection.OrderByDescending(x => x.Property).First();
Run Code Online (Sandbox Code Playgroud)
但从性能的角度来看,这是好方法吗?也许我应该做这样的事情?
var maxValOfProperty = collection.Max(x => x.Property);
var itemWithMaxPropValue = collection
.Where(x => x.Property == maxValueOfProperty).First();
Run Code Online (Sandbox Code Playgroud) 我有以下课程:
class Product
{
public string ProductName { get; set; }
public DateTime ActivationDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我创建并填写一个 List<Product>,我想ProductName从Product最新的ActivationDate.
Product.Where(m => m.ActivationDate == Max(m.ActivationDate)).Select(n => n.ProductName)
Product.Max(m => m.ActivationDate).Select(n => n.ProductName)
Run Code Online (Sandbox Code Playgroud)
但机器人方法不起作用.有人知道实现这项任务的方法吗?
我不只是想在列表中找到最大值。我正在尝试为给定的字符串标题找到具有最大值的每个对象。最终结果将是一个列表对象,其中只有具有最大值的对象。
我似乎无法让我的 LINQ 语句起作用。它不断拉取最大整数值,而不是拉取具有最大整数值的对象。
另外,如果有更有效的路线而不是循环遍历列表 - 我完全赞成。
任何帮助是极大的赞赏
编辑这不是Servy建议的此链接的重复
如果@Servy 专注于阅读文本而不是比较标题,他/她会发现这是完全不同的,那么这不是 Servy。该链接想要找到对象的单个最大值。这不是我要问的。
这是我当前的代码:
public class Prop {
public string title {get;set;}
public int val {get;set;}
}
public static void Main()
{
List<Prop> list = new List<Prop>();
list.Add(newProp("voltage", 7));
list.Add(newProp("voltage", 24));
list.Add(newProp("systemconfiguration", 2451));
list.Add(newProp("systemunit", 0));
list.Add(newProp("systemunit", 15));
list.Add(newProp("voltage", 0));
List<Prop> newList = new List<Prop>();
foreach (var p in list) {
var newP = list.Select(r => r).Where(t => t.title == p.title).Max(v => v.val);
Console.WriteLine(newP.ToString());
//This is returning …Run Code Online (Sandbox Code Playgroud)