4

我正在尝试确定是否有更好的方法来执行以下查询:

我有一个List对象Pair

APair定义为

public class Pair
{
    public int IDA;
    public int IDB;
    public double Stability;
}

我想提取包含在List<Pair>.

我目前正在使用

var pIndices = pairs.SelectMany(p => new List<int>() { p.IDA, p.IDB }).Distinct().ToList();

new List<int>哪个行得通,但对我来说创建一个只是让它变平似乎不直观SelectMany

这是我觉得至少可以说不雅的另一种选择:

var pIndices = pairs.Select(p => p.IDA).ToList();
pIndices.AddRange(pairs.Select((p => p.IDB).ToList());
pIndices = pIndices.Distinct().ToList();

有没有更好的办法?如果没有,你更喜欢哪一个?

4

6 回答 6

7

在单独选择 A 和 B 后,您可以使用Union()它们来获取它们。

var pIndices = pairs.Select(p => p.IDA).Union(pairs.Select(p => p.IDB));
于 2012-12-06T14:54:34.170 回答
2

您可以将内部表达式缩短为p => new [] { p.IDA, p.IDB }.

于 2012-12-06T14:55:13.607 回答
2

这是一个没有新系列的:

var pIndices = pairs.Select(p => p.IDA)
                .Concat(pairs.Select(p => p.IDB))
                .Distinct();
于 2012-12-06T14:59:45.287 回答
2

如果您不想为 each 创建一个 2 元素数组/列表Pair,并且不想重复您的pairs列表两次,您可以手动完成:

HashSet<int> distinctIDs = new HashSet<int>();
foreach (var pair in pairs)
{
    distinctIDs.Add(pair.IDA);
    distinctIDs.Add(pair.IDB);
}
于 2012-12-06T15:02:26.167 回答
1

像这样缩短它:

var pIndices = pairs.SelectMany(p => new[] { p.IDA, p.IDB }).Distinct().ToList();
于 2012-12-06T14:56:34.197 回答
1

使用Enumerable.Repeat有点不正统,但无论如何:

var pIndices = pairs
    .SelectMany(
        p => Enumerable.Repeat(p.IDA, 1).Concat(Enumerable.Repeat(p.IDB, 1))
    ).Distinct()
    .ToList();

最后,如果你不介意一个小助手类,你可以这样做:

public static class EnumerableHelper {
    // usage: EnumerableHelper.AsEnumerable(obj1, obj2);
    public static IEnumerable<T> AsEnumerable<T>(params T[] items) {
        return items; 
    }
}

现在你可以这样做:

var pIndices = pairs
    .SelectMany(p => EnumerableHelper.AsEnumerable(p.IDA, p.IDB))
    .Distinct()
    .ToList();
于 2012-12-06T15:07:02.067 回答