0

私はこのようなデータベーステーブルを持っています:

## Settings ##
ID (string)
Value (string)

IDは、このArea.Category.SettingNameのような文字列です。IDを元にメニュー構造を構築しようとしているので、このように表示したいと思います。

- Area
-- Category
--- SettingName

データは次のようになります。

AreaOne.CategoryOne.MySetting
AreaOne.CategoryOne.MySecondSetting
AreaTwo.CategoryOne.MySetting
...

それで、これを行うために、私はすべてのレベル1設定を取得しようとしました、そして私はこのコードを使用してそれを試みました:

List<Settings> settings = settings.GroupBy(x => x.ID.Split('.')[0]).FirstOrDefault().ToList()

そして、この結果を期待しました:

AreaOne
AreaTwo

しかし、この結果を得ました:

AreaOne
AreaOne
AreaTwo

私は何が間違っているのですか?

4

3 に答える 3

1

レベル1の設定だけが必要な場合、正しいクエリは次のようになります。

var delimiter = new[] {'.'};
settings.Select(x => x.ID.Split(delimiter, 2)[0]).Distinct().ToList()

これにより、各行からL1設定が切り離され、Distinctそれぞれを1回だけ戻すように使用されます。各L1設定に関する集約情報を取得する場合を除いて、使用する必要はありませんGroupBy(たとえば、データベースから完全な情報を取得したいが、何らかの理由で便利なためにL1設定名にグループ化されている場合)。

また、「制限」パラメーターを使用するオーバーロードを使用しましたSplit。これは、破棄する作業を行う意味がないためです。

最後に、との組み合わせを使用すると、パフォーマンスの面でさらに優れたものにFirstIndexOfなります。Substring

于 2012-05-07T11:05:43.803 に答える
0

'.Distinct()'を追加するか、再コーディングして

var result = settings.Select(s => x.ID.Split('.')[0]).Distinct();
于 2012-05-07T11:06:13.460 に答える
0

結果リストから重複するエントリを削除する必要があります。3つの入力があるので、3つの出力を取得します。

次のようなものは、それぞれ1つだけを返す必要があります。

settings.Select(x => x.ID.Split('.')[0]).Distinct().ToList()
于 2012-05-07T11:06:51.930 に答える