1

各バグ ID に関連するファイル名の個別のリストを見つけようとしています。linq を使用して、各バグ ID に関連するすべてのファイル名をグループ化しました。各バグ ID に関連する重複したファイル名を削除する方法がわかりません。ファイル出力には、次のような複数の行があります。同じ bugid で、バグ ID ごとにファイル名が重複しています。これが私のコードです。

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;


namespace finalgroupquery
{
    class MainClass
{
        public static void Main (string[] args)
        {

            List <bug> list2=new List <bug> ();
             using(System.IO.StreamReader reader1= new System.IO.StreamReader( @"/home/output"))
                using (System.IO.StreamWriter file = new System.IO.StreamWriter( @"/home/output1")) 
                        {string line1;
                         while ((line1=reader1.ReadLine())!=null) 
                            { string[] items1=line1.Split('\t');        
                                    bug bg=new bug();
                                      bg.bugid=items1[0];
                                for (int i=1; i<=items1.Length -1;i++)
                                    { bg.list1.Add(items1[i]);}
                                            list2.Add(bg);
                            }

                            var bugquery= from c in list2 group c by c.bugid into x select
                                            new Container { BugID = x.Key, Grouped = x };



                            foreach (Container con in bugquery)
                            {
                                StringBuilder files = new StringBuilder();
                                files.Append(con.BugID);
                                files.Append("\t");

                                foreach(var x in con.Grouped)
                                {
                                    files.Append(string.Join("\t", x.list1.ToArray()));
                                }

                                file.WriteLine(files.ToString());       }


            }
        }
    }

    public class Container
    {
        public string BugID {get;set;}
        public IGrouping<string, bug> Grouped {get;set;}
    }

    public class bug
    { 
        public List<string> list1{get; set;}
        public string bugid{get; set;}

        public bug()
        {
            list1=new List<string>();
        }       


    }
}


}
4

2 に答える 2

1

このコードを使用してみてください:

        var bugquery = from c in list2
                        group c by c.bugid into x
                        select new bug { bugid = x.Key, list1 = x.SelectMany(l => l.list1).Distinct().ToList() };

        foreach (bug bug in bugquery)
        {
            StringBuilder files = new StringBuilder();
            files.Append(bug.bugid);
            files.Append("\t");
            files.Append(string.Join("\t", bug.list1.ToArray()));

            file.WriteLine(files.ToString());
        }

SelectManyとLinq 演算子の組み合わせによりDistinct、ファイル名リストを平坦化し、重複を 1 行で削除できます。

SelectMany ( msdnから):

シーケンスの各要素を IEnumerable に射影し、結果のシーケンスを 1 つのシーケンスにフラット化します。

異なる ( msdnから):

シーケンスから個別の要素を返します。

また、コレクションContainerを反復処理する必要がなくなったため、クラスが不要になっ たことも意味します(ここには、バグに関連するすべてのファイル名が含まれており、重複はありません)。IGrouping<string, bug>list1

編集

ファイルを読み取って解析した後、空白行や空の文字列がいくつかある可能性があるため、次のコードを使用してそれらを取り除くことができます。

        using (System.IO.StreamReader reader1 = new System.IO.StreamReader(@"/home/sunshine40270/mine/projects/interaction2/fasil-data/common history/outputpure"))
        {
            string line1;
            while ((line1 = reader1.ReadLine()) != null)
            {
                if (!string.IsNullOrWhiteSpace(line1))
                {
                    string[] items1 = line1.Split(new [] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    bug bg = new bug();
                    bg.bugid = items1[0];
                    for (int i = 1; i <= items1.Length - 1; i++)
                    {
                        bg.list1.Add(items1[i]);
                    }
                    list2.Add(bg);
                }
            }
        }

あなたは気づくでしょう:

  • に格納された新しい行line1は、ストリームから取得されるとすぐに空かどうかがチェックされます ( を使用!string.IsNullOrWhiteSpace(line1)) 。
  • string.Splitメソッドの戻り値から空の部分文字列を省略するには、StringSplitOptions.RemoveEmptyEntriesパラメーターを使用できます。

お役に立てれば。

于 2013-10-28T23:57:57.530 に答える
1

あなたの説明から、これをやりたいように聞こえます:

        List <bug> bugs = new List<bug>();
        var lines = System.IO.File.ReadLines(@"/home/bugs");
        foreach (var line in lines) {
            string[] items = line.Split('\t');
            bug bg=new bug();
            bg.bugid = items[0];
            bg.list1 = items.Skip(1).OrderBy(f => f).Distinct().ToList();
            bugs.Add(bg);
            }

これにより、オブジェクトのリストが生成されます。各オブジェクトには一意のファイル名のリストがあります。

于 2013-10-29T00:02:51.173 に答える