1

私ができるようにしたいのは、searchValues リストで重複する itemId を検索し、それらが見つかったら、単一の文字列値を文字列値配列に配置することです。

SearchValue オブジェクト:

public class SearchValue<TItemId>
{
    public TItemId ItemId { get; set; }
    public string Value { get; set; }
    public string[] Values { get; set; }
}

初期化後の私のテスト検索値は次のようになります。

   searchValues[0]
        .ItemId == 16
        .Value == "2"
    searchValues[1]
        .ItemId == 16
        .Value == "3"
    searchValues[2]
        .ItemId == 15
        .Value == "6"
    searchValues[3]
        .ItemId == 15
        .Value == "3"
    searchValues[4]
        .ItemId == 5
        .Value == "Vertonghen"

最終結果を次のようにしたいと思います。

searchValues[0]
    .ItemId == 16
    .Values == "2,3"
searchValues[1]
    .ItemId == 15
    .Values == "6,3"
searchValues[2]
    .ItemId == 5
    .Value == "Vertonghen"

私は本当にLINQを使ってこれをやりたいと思っています。このようにして、別の SearchValue のリストを作成できました。

List<SearchValue<Byte>> duplicateSearchItems = (from x in searchValues
                                 group x by x.ItemId into grps
                                 orderby grps.Key
                                 where grps.Count() > 1
                                 select grps).SelectMany(group => group).ToList();

...しかし、values 配列に値を取得すると問題が発生します。理想的には、LINQ が重複レコードを含む単一のリストを返すことができれば、重複していないレコードはそのままで、配列に変換されます。おそらく、ある種のネストされたクエリですか?私は困惑しています。何か案は?

前もって感謝します!

4

4 に答える 4

0

Linq だけを使用して、元のリストを変更したり、リスト内の項目を変更したりすることはできません。ただし、これを実行して新しいリストを作成できます。

List<SearchValue<Byte>> results = 
    (from x in searchValues
     group x by x.ItemId into g
     select new SearchValue<Byte>()
     {
         ItemId = g.Key,
         Value = g.Value.First().Value,
         Values = g.Value.Select(i => i.Value).ToArray(),
     }
    .ToList();

または流暢な構文で:

List<SearchValue<Byte>> results = searchValues
    .GroupBy(x => x.ItemId)
    .Select(g => new SearchValue<Byte>()
            {
                ItemId = g.Key,
                Value = g.Value.First().Value,
                Values = g.Value.Select(i => i.Value).ToArray(),
            })
   .ToList();

ただし、状況によっては、 のILookup方が適している場合があります。

var results = searchValues.ToLookup(x => x.ItemId, x => x.Value);
Console.Write(String.Join(", ", results[16])); // 2, 16
于 2013-05-31T18:47:05.067 に答える
0

なぜ辞書を使わないのですか

    Dictionary<int,string> d = new Dictionary<int,string>();
    foreach(var x in searchValues)
    {
        if(d.ContainsKey(x.ItemId))
           d[x.ItemId] = string.Format("{0},{1}",d[x.ItemId],x.Value);
        else
           d.Add(x.ItemId,x.Value);
    }

最後に、単に Dictionary を反復処理します

    foreach(var entry in d)
    {
       ConsoleWriteline(entry.Key+" : "+entry.Value);
    }
于 2013-05-31T18:44:46.427 に答える