2015-01-12 1 views
0

У меня есть следующий сценарий:Linq, фильтр и поиск с использованием сложной структуры класса

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, я считаю, что это можно сделать без него, но это будет очень сложный и подверженный ошибкам код. Не могли бы вы помочь мне ..

+3

Является ли ваш прошлый опыт в Java? Почему вы не используете авто-свойство, которое создало бы для вас геттер? Вся ваша семейная вещь может быть «public int Family {get; set;}» –

+0

Прежде всего вам нужно выставить элементы «Term», которые вы добавляете в класс «Document». Предпочтительно, используя «IEnumerable », если вы хотите использовать Linq – juharr

ответ

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(); 
1

Вы можете использовать GroupBy, чтобы сгруппировать последовательность терминов по семейному номеру, а затем позвоните по номеру Count, чтобы получить количество различных групп.

Положите все это на звонок OrderByDescending, и вы будете заказывать документы по количеству отдельных семей на всех своих условиях.

Смежные вопросы