web-dev-qa-db-ja.com

LINQを使用して列内のすべての異なる値を選択する

VS 2012でWeb Apiを作成しました。1つの列 "Category"からすべての値を取得しようとしています。つまり、すべて一意の値です。リストが重複して返されるのは望ましくありません。

このコードを使用して、特定のカテゴリの製品を取得しました。カテゴリの完全なリスト([カテゴリ]列のすべての一意の値)を取得するにはどうすればよいですか?

public IEnumerable<Product> GetProductsByCategory(string category)
    {
        return repository.GetAllProducts().Where(
            p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));
    }
33
Tester

一意のカテゴリを作成するには:

var uniqueCategories =  repository.GetAllProducts()
                                  .Select(p=>p.Category)
                                  .Distinct();
61
Alireza
var uniq = allvalues.GroupBy(x => x.Id).Select(y=>y.First()).Distinct();

簡単でシンプル

20
Dmitry Gribkov

次の詳細クラスを持つ個別の行を見つける必要があります:Scountry
列:countryID、countryName、isactive
これには主キーはありません。次のクエリで成功しました

public DbSet<SCountry> country { get; set; }
    public List<SCountry> DoDistinct()
    {
        var query = (from m in country group m by new { m.CountryID, m.CountryName, m.isactive } into mygroup select mygroup.FirstOrDefault()).Distinct();
        var Countries = query.ToList().Select(m => new SCountry { CountryID = m.CountryID, CountryName = m.CountryName, isactive = m.isactive }).ToList();
        return Countries;
    }
2
Basant tiwari

興味深いことに、これらの両方をLinqPadで試してみましたが、Dmitry Gribkov byのグループを使用したバリアントはより高速に見えます。 (また、結果は既に明確であるため、最終的な区別は必要ありません。

私の(やや単純な)コードは次のとおりです。

public class Pair 
{ 
    public int id {get;set;}
    public string Arb {get;set;}
}

void Main()
{

    var theList = new List<Pair>();
    var randomiser = new Random();
    for (int count = 1; count < 10000; count++)
    {
        theList.Add(new Pair 
        {
            id = randomiser.Next(1, 50),
            Arb = "not used"
        });
    }

    var timer = new Stopwatch();
    timer.Start();
    var distinct = theList.GroupBy(c => c.id).Select(p => p.First().id);
    timer.Stop();
    Debug.WriteLine(timer.Elapsed);

    timer.Start();
    var otherDistinct = theList.Select(p => p.id).Distinct();
    timer.Stop();
    Debug.WriteLine(timer.Elapsed);
}
0
Drew