使用复杂 class 结构的 Linq、过滤和检索
Linq, filter and retrieval using complex class structure
我有以下场景:
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);
}
}
在不同的 class...
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 做到这一点,我相信没有它也可以做到,但它将是非常复杂且容易出错的代码。你能帮帮我吗..
您可以使用 GroupBy
按家庭编号对术语序列进行分组,然后对其调用 Count
以获得不同组的数量。
将所有这些放在一个 OrderByDescending
调用中,您将根据所有术语中不同家族的数量对文档进行排序。
您应该使用属性。这就是他们的目的。此外,要使用 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();
我有以下场景:
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);
}
}
在不同的 class...
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 做到这一点,我相信没有它也可以做到,但它将是非常复杂且容易出错的代码。你能帮帮我吗..
您可以使用 GroupBy
按家庭编号对术语序列进行分组,然后对其调用 Count
以获得不同组的数量。
将所有这些放在一个 OrderByDescending
调用中,您将根据所有术语中不同家族的数量对文档进行排序。
您应该使用属性。这就是他们的目的。此外,要使用 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();