如何使用LINQ获取一个属性不同的项目列表?

时间:2016-11-29 11:02:37

标签: c# linq

我试图获取具有以下特征的项目列表。我需要强调那些只有字段不同的字段" 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; }
}

任何评论都将受到高度赞赏。

2 个答案:

答案 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)