4

次のクエリを実行するためのより良い方法があるかどうかを判断しようとしています:

私はListPairオブジェクトを持っています。

APairは次のように定義されます。

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

に含まれるすべての個別の ID (int) のリストを抽出したいと思います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

Union()個別に選択した後、A と B の両方を取得するために使用できます。

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

各 に対して 2 要素の配列/リストを作成したくない場合、およびリストを 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 に答える
2

これは新しいコレクションのないものです:

var pIndices = pairs.Select(p => p.IDA)
                .Concat(pairs.Select(p => p.IDB))
                .Distinct();
于 2012-12-06T14:59:45.287 に答える
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 に答える
1

次のように短くします。

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