我试图获取具有以下特征的项目列表。我需要强调那些只有字段不同的字段" item_differ"。因此,我编写了以下代码来查找所需的记录。这段代码适用于我正在寻找的东西,但想知道是否有更聪明的方式(更少的线路和更好的表现或任何)
void Main()
{
var MyItemList = GetItemList();
var Pair_of_items = (from p in MyItemList
let true_items = from f in MyItemList
where (new { p.item1, p.item2, p.item3,
p.item4, p.item5}
== new { f.item1, f.item2, f.item3,
f.item4, f.item5})
&& f.item6_differ != p.item6_differ
select f
select true_items).SelectMany(x => x);
}
// Define other methods and classes here
public class MyClass
{
public string item1 { get; set; }
public string item2 { get; set; }
public string item3 { get; set; }
public string item4 { get; set; }
public string item5 { get; set; }
public bool item6_differ { get; set; }
}
任何评论都将受到高度赞赏。
答案 0 :(得分:2)
我认为这会返回相同的结果,但much more efficient:
var Pair_off_items =
from p in MyItemList
join f in MyItemList
on new {p.item1, p.item2, p.item3, p.item4, p.item5} equals new {f.item1, f.item2, f.item3, f.item4, f.item5}
where f.item6_differ != p.item6_differ
select f;
答案 1 :(得分:1)
另一种方法是在项目1到5上使用group by
第一组(具有在标准中定义一次属性的可维护性优势),然后检查组item6_differ
< / p>
var Pair_off_items = from p in MyItemList
group p by new {p.item1, p.item2, p.item3, p.item4, p.item5} into g
where g.GroupBy(f=>f.item6_differ).Count() > 1
from p in g
select p;
在上面的查询中,g
将包含具有相同项目1到5的所有项目。有多种方法可以检查组是否包含不同的item6值。使用超过第二个groupby,但您可以使用其他选项。例如where g.Select(f=>f.item6_differ).Distinct().Count() > 1
也应该有效let first = g.First().item6_differ where g.Any(f=>f.item6_differ != first)