Как получить номер соответствия ключевого слова для многих категорий? - PullRequest
1 голос
/ 16 февраля 2011

Как получить номер соответствия ключевого слова для многих категорий?

Сценарий таков: когда я набираю ключевое слово продукта, я хочу получить номер элемента совпадения во многих категориях.

Например, когда я набираю ключевое слово «iphone», на странице будет отображаться номер элемента совпадения во многих категориях:

Mobile(5)
battery(2)
app(6)
typeA(2)
typeB(9)
typeC(15)
typeC(1)
typeD(9)
typeE(7)
typeF(8)
......
......
typeZ(5)



public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
}

public class Type
{
    public int TypeId { get; set; }
    public string TypeName { get; set; }
}

public class ProductType
{
    public int ProductId { get; set; }
    public int TypeId { get; set; }
}

/// <summary>
/// Test Data
/// </summary>
public class TestData
{
    public List<Product> GetProductList()
    {
        var list = new List<Product>(){
             new Product(){ ProductId=1, ProductName = "iphone1"},
             new Product(){ ProductId=2, ProductName = "iphone2"},
             new Product(){ ProductId=3, ProductName = "iphone3"},
             new Product(){ ProductId=4, ProductName = "ipad1"},
             new Product(){ ProductId=5, ProductName = "ipad2"},
             new Product(){ ProductId=6, ProductName = "mobile1"},
             new Product(){ ProductId=7, ProductName = "mobile2"},
             new Product(){ ProductId=8, ProductName = "cpu1"},
             new Product(){ ProductId=9, ProductName = "cpu2"},
             new Product(){ ProductId=10, ProductName = "cpu3"}
            };
        return list;
    }

    public List<Type> GetTypeList()
    {
        var list = new List<Type>(){
             new Type(){ TypeId=1, TypeName = "type1"},
             new Type(){ TypeId=2, TypeName = "type2"},
             new Type(){ TypeId=3, TypeName = "type3"},
             new Type(){ TypeId=4, TypeName = "type4"},
             new Type(){ TypeId=5, TypeName = "type5"}         
            };
        return list;
    }

    public List<ProductType> GetProductTypeList()
    {
        var list = new List<ProductType>(){
             new ProductType(){ ProductId=1, TypeId=1},
             new ProductType(){ ProductId=1, TypeId=2},
             new ProductType(){ ProductId=2, TypeId=1},
             new ProductType(){ ProductId=2, TypeId=3},
             new ProductType(){ ProductId=2, TypeId=4},
             new ProductType(){ ProductId=3, TypeId=2},
             new ProductType(){ ProductId=3, TypeId=5},
             new ProductType(){ ProductId=4, TypeId=2},
             new ProductType(){ ProductId=4, TypeId=3},
             new ProductType(){ ProductId=4, TypeId=5},
             new ProductType(){ ProductId=5, TypeId=2},
             new ProductType(){ ProductId=5, TypeId=4},
             new ProductType(){ ProductId=6, TypeId=1},
             new ProductType(){ ProductId=6, TypeId=2},
             new ProductType(){ ProductId=7, TypeId=2},
             new ProductType(){ ProductId=7, TypeId=5},
             new ProductType(){ ProductId=8, TypeId=2},
             new ProductType(){ ProductId=9, TypeId=3},
             new ProductType(){ ProductId=10, TypeId=2}
            };
        return list;
    }

Как реализовать это для лучшей производительности?

Я использую C # ASP.NET.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011

Вы могли бы сделать это с LINQ - не очень хорошо сейчас, но это работает и дает вам список TypeMatches, который содержит имя типа и количество совпадений для типа.

TestData testData = new TestData();
string keyword = "iphone";
var ProductListMatches = testData.GetProductList().Where(p => p.ProductName.Contains(keyword)).ToList();

var ProductTypeMatches = (from product in ProductListMatches
                            join productType in testData.GetProductTypeList() 
                            on product.ProductId equals productType.ProductId
                            select productType).ToList();

var TypeMatches = (from productTypeMatch in ProductTypeMatches
                    join pType in testData.GetTypeList()
                        on productTypeMatch.TypeId equals pType.TypeId
                    select pType).GroupBy(p => p.TypeId)
                    .Select(g => new { TypeName =  g.First().TypeName, Count = g.Count() })
                    .ToList();
0 голосов
/ 16 февраля 2011

Если у вас есть

public class Item {
    public string Name;
    public string Keyword;
    public int Num;
}

и

List<Item> items = new List<Item>();

, тогда

var items2 = items.ToLookup(p => p.Keyword);

, и вы можете искать ключевое слово следующим образом:

foreach (var item in items2[Keyword]) {
}

Но, возможно, вам нужно больше, чем ключевое слово для каждого элемента ...

 public class Item
 {
     public string Name;
     public List<string> Keywords = new List<string>();
     public int Num;
 }

 List<Item> items = new List<Item>();
 var items2 = items.SelectMany(p => p.Keywords.Select(q => new { Keyword = q, Item = p })).ToLookup(p => p.Keyword, p => p.Item);

То же использование, что и раньше.

Если вы не хотели делать это на SQL: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...