Select All distinct values in a column using LINQ

C#LinqVisual Studio-2012Csvasp.net Web-Api

C# Problem Overview


I created a Web Api in VS 2012. I am trying to get all the value from one column "Category", that is all the unique value, I don't want the list to be returned with duplicates.

I used this code to get products in a particular category. How do I get a full list of categories (All the unique values in the Category Column)?

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

C# Solutions


Solution 1 - C#

To have unique Categories:

var uniqueCategories =  repository.GetAllProducts()
                                  .Select(p=>p.Category)
                                  .Distinct();

Solution 2 - C#

var uniq = allvalues.GroupBy(x => x.Id).Select(y=>y.First()).Distinct();

Easy and simple

Solution 3 - C#

I have to find distinct rows with the following details class : Scountry
columns: countryID, countryName,isactive
There is no primary key in this. I have succeeded with the followin queries

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;
    }

Solution 4 - C#

Interestingly enough I tried both of these in LinqPad and the variant using group from Dmitry Gribkov by appears to be quicker. (also the final distinct is not required as the result is already distinct.

My (somewhat simple) code was:

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);
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTesterView Question on Stackoverflow
Solution 1 - C#AlirezaView Answer on Stackoverflow
Solution 2 - C#Dmitry GribkovView Answer on Stackoverflow
Solution 3 - C#Basant tiwariView Answer on Stackoverflow
Solution 4 - C#DrewView Answer on Stackoverflow