开发者

linq to objects query: select objects where no other values exist

Help with the linq query to select the object where each date only has item of one value. So in the following list:

1) 2011-1-4 would be selected because its items are both 25

2) 2011-1-1 would not be selected because it has items 22 and 25

3) 2011-1-2 and 2011-1-3 would be selected because they only have one item.

    public class MyClass
    {
        public DateTime date { get; set; }
        public int item { get; set; }
    }
    static void Main(string[] args)
    {
        List<MyClass> classes = new List<MyClass> 
        {
        { new MyClass() { date = new DateTime(2011, 1, 1), item = 22 } },
        { new MyClass() { date = new DateTime(2011, 1, 1), item = 25 } },
 开发者_高级运维       { new MyClass() { date = new DateTime(2011, 1, 2), item = 23 } },
        { new MyClass() { date = new DateTime(2011, 1, 3), item = 24 } },
        { new MyClass() { date = new DateTime(2011, 1, 4), item = 25 } },
        { new MyClass() { date = new DateTime(2011, 1, 4), item = 25 } },
        };
    }

What about this? Pretty much got from looking at your guys' answers.

            var results = classes.GroupBy(m => m.date);
        var q = from n in results where n.All( r => r.item == n.First().item) select n;


This is some unedited ugliness that I've run through Linqpad that seems to meet your requirement.

var query = classes.GroupBy(c => c.date)
                   .Select(g => g.GroupBy(c => c.item))
                   .Where(sg => sg.Count() == 1)
                   .SelectMany(sg => sg)
                   .SelectMany(g => g)
                   .Select(c => c.date)
                   .Distinct();

Returns the dates 1/2, 1/3, and 1/4 as per your requirement.


This seems to work, but I wouldn't say I'm happy with it:

var results = from m in classes
              group m by new { m.date } into x
              where x.GroupBy(y => y.item).Count() == 1
              select x;


var results = classes
         .GroupBy(m => m.date)
         .Where(g => g.Select(x => x.item).Distinct().Count() == 1)
         .Select(g => g.Key).ToList();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜