【问题标题】:Linq, filter and retrieval using complex class structure使用复杂类结构的Linq、过滤和检索
【发布时间】:2015-01-12 20:32:11
【问题描述】:

我有以下情况:

public class Term{
    private int _family;

    public void setFamily(int family){
         _family = family;
     }
    public int getFamily(){
        return _family
    }

}


public class Document{
     private List<Term> _terms_in_document;

     public void addTerm(Term t){
         _terms_in_document.add(t);
     }
}

在不同的班级...

   Term t1 = new Term();
   t1.setFamily(1);

   Term t2 = new Term();
   t2.setFamily(1);

   Term t3 = new Term();
   t3.setFamily(1);


   Document d1 = new Document();
    d1.addTerm(t1);
    d1.addTerm(t2);
    d1.addTerm(t3);

   Term t4 = new Term();
   t4.setFamily(1);

   Term t5 = new Term();
   t5.setFamily(2);

   Term t6 = new Term();
   t6.setFamily(3);


   Document d2 = new Document();
    d2.addTerm(t4);
    d2.addTerm(t5);
    d2.addTerm(t6);

我需要使用 LINQ 来获取那些包含具有最多不同族的术语的文档。在我们的示例中,d2 将排在第一位,因为它的术语属于族 1、2 和 3。而 d1 必须排在第二位,因为它的所有术语都属于同一个族。到目前为止,我无法使用 linq 做到这一点,我相信没有它也可以做到,但它会是非常复杂且容易出错的代码。你能帮帮我吗..

【问题讨论】:

  • 您过去有 Java 经验吗?为什么不使用会为您生成 getter setter 的自动属性?你全家的事情可能是“public int Family {get; set;}”
  • 首先,您需要公开您添加到 Document 类的 Term 项目。如果你想使用 Linq,最好通过实现 IEnumerable&lt;Term&gt;

标签: c# linq linq-to-sql


【解决方案1】:

您应该使用属性。这就是他们的目的。此外,要使用 LINQ,您需要一组文档。简而言之,您的代码可以转换为:

public class Term
{
    public int Family { get; set; }
}

public class Document
{
    private List<Term> terms = new List<Term>();
    public List<Term> Terms { get { return terms; } set { terms = value; } } 
}

internal class Program
{
    private static void Main(string[] args)
    {
        Term t1 = new Term { Family = 1 };  // Object Initializer Syntax
        Term t2 = new Term { Family = 1 };
        Term t3 = new Term { Family = 1 };

        Document d1 = new Document();
        d1.Terms.Add(t1);
        d1.Terms.Add(t2);
        d1.Terms.Add(t3);

        Term t4 = new Term { Family = 1 };
        Term t5 = new Term { Family = 2 };
        Term t6 = new Term { Family = 3 };

        Document d2 = new Document();
        d2.Terms.Add(t4);
        d2.Terms.Add(t5);
        d2.Terms.Add(t6);

        List<Document> docs = new List<Document> {d1, d2};
    }
}

那么您可以使用以下方法进行计算:

var mostDistinctFamilies = docs.GroupBy(d => d.Terms.Select(t => t.Family).Distinct().Count())
                               .OrderByDescending(d => d.Count())
                               .First();

【讨论】:

    【解决方案2】:

    您可以使用GroupBy按家族编号对术语序列进行分组,然后在其上调用Count以获取不同组的数量。

    将所有这些都放在OrderByDescending 电话中,您将按照所有条款中不同家庭的数量对文档进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      相关资源
      最近更新 更多