Both Marc's and dahlbyk's answers seems to work very well. I have a much simpler solution though. Instead of using Distinct
, you can use GroupBy
. It goes like this:
var listDistinct
= list.GroupBy(
i => i.value1,
(key, group) => group.First()
).ToArray();
Notice that I've passed two functions to the GroupBy()
. The first is a key selector. The second gets only one item from each group. From your question, I assumed First()
was the right one. You can write a different one, if you want to. You can try Last()
to see what I mean.
I ran a test with the following input:
var list = new [] {
new { value1 = "ABC", objT = 0 },
new { value1 = "ABC", objT = 1 },
new { value1 = "123", objT = 2 },
new { value1 = "123", objT = 3 },
new { value1 = "FOO", objT = 4 },
new { value1 = "BAR", objT = 5 },
new { value1 = "BAR", objT = 6 },
new { value1 = "BAR", objT = 7 },
new { value1 = "UGH", objT = 8 },
};
The result was:
//{ value1 = ABC, objT = 0 }
//{ value1 = 123, objT = 2 }
//{ value1 = FOO, objT = 4 }
//{ value1 = BAR, objT = 5 }
//{ value1 = UGH, objT = 8 }
I haven't tested it for performance. I believe that this solution is probably a little bit slower than one that uses Distinct
. Despite this disadvantage, there are two great advantages: simplicity and flexibility. Usually, it better to favor simplicity over optimization, but it really depends on the problem you're trying to solve.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…