Linq到集合(where子句)
本文关键字:子句 where 集合 Linq | 更新日期: 2023-09-27 18:07:58
我试图获得一个集合中最后添加的版本。在这个集合中是一个'|'(管道分隔的字符串…),其中一个管道段的数字很高。我试图得到一个唯一的集合,具有所有这些字符串的最高数量…这听起来可能是一个非常大的问题,我不确定linq是否可以处理这个问题。(我不太使用Linq,所以我不确定它能做什么,不能做什么。做这种事可能吗?如果是,你将如何实现它?简单的算法是需要的,不需要代码,我只需要一个想法,我需要去哪里。
谢谢。
更新:我想做的代码示例…
List<SelectListItem> PatientList = new List<SelectListItem>();
foreach (XmlNode node in nodeList)
{
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(node.OuterXml);
string popPatInfo = xDoc.SelectSingleNode("./template/elements/element[@name='"FirstName'"]").Attributes["value"].Value + ", " + xDoc.SelectSingleNode("./template/elements/element[@name='"LastName'"]").Attributes["value"].Value + " | " + DateTime.Parse(xDoc.SelectSingleNode("./template/elements/element[@name='"DateOfBirth'"]").Attributes["value"].Value.Split('T')[0]).ToString("dd-MMM-yyyy");
string patientInfo = xDoc.SelectSingleNode("./template/elements/element[@name='"PatientId'"]").Attributes["value"].Value + "|" + xDoc.SelectSingleNode("./template/elements/element[@name='"PopulationPatientID'"]").Attributes["enc"].Value + "|" + xDoc.SelectSingleNode("./template/elements/element[@name='"AdminDate'"]").Attributes["value"].Value;
PatientList.Add( new SelectListItem { Text = popPatInfo, Value = patientInfo });
}
var queryResults = PatientList.GroupBy(x => x.Value).Select(x => x.FirstOrDefault());
如您所见,我目前有一个列表,它从该集合中获取唯一条目。我希望唯一项也有最高的
Node.Attributes["enc"].Value
是字符串中的一个管道。我想知道这是否可能?
更新二下面是我尝试的一种方法,这只是我试图很好地掌握linq…
PatientList.GroupBy(x=>x.Value.Split('|')[1].Max).Select(x => x.FirstOrDefault());
UPDATE 3:目标澄清我需要一个唯一的selectListItems列表列表中的每个成员都有一个最大值。
UPDate简单示例
我将有一个简单的例子,不会有所有的字段在管道分隔的字符串,我早些时候发布。这毕竟只是一个例子……
select listtitem I have
Text: Value1, Value: notUnique|0|endofstring
Text: Value2, Value: notUnique|1|endofString
Text: Value3, Value: notUnique|2|endofString
Text: Value4, Value: Unique1|0|endofString
SelectListItem I want
Text: Value1, Value: notUnique|2|endofstring
Text: Value1, Value: Unique1|0|endofstring
我让这段代码工作:
var strValues =
@"notUnique|0|endofstring,
notUnique|1|endofString,
notUnique|2|endofString,
Unique1|0|endofString";
var values = strValues.Split(',');
var newValues = values.Select(x =>
{
var y = x.Split('|');
return new { Category = y[0], Value = y[1], TheString = y[2] };
});
var test = newValues.GroupBy(p => p.Category)
.Select(g => new
{
Category = g.Key,
Value = g.Max(p => p.Value)
});
foreach(var t in test)
{
Console.WriteLine(t);
}
你也许能把它变成你需要的东西。前几行只是模拟从csv读取值。对于代码的质量,我很抱歉,我没有时间来清理它或塑造它更接近你上面发布的代码。
取自http://msdn.microsoft.com/en-us/vcsharp/aa336747#maxGrouped
完全未经测试。可能包含错误。
var queryResults =
from p in PatientList
group p by p.Value into g
select new SelectListItem { Text= g.Key, Value= g.Max(p => p.Value.Split('|')[1]) };