-4

私は次のようにリスト<>を入力しています:

IDmukeyFieldIDタイプPercentOfFieldエーカー
-------------------------------------------------- -------------
11709649191マイナー1812.5181
21709641191マイナー10.49621
3 1709620 191メジャー、クリティカル72 49.4322
41709622191マイナー95.89865

タイプがメジャー、クリティカルの項目3を取得し、タイプが一方のレコードでメジャーで、もう一方のレコードでクリティカルである場合を除いて、まったく同じデータを持つ2つのレコードに分割します。foreachを使用してリストをループする場合、このレコードを2つに分割できますか?

4

3 に答える 3

2

あなたは次のようなものを意味します(テストされておらず、頭のてっぺんから離れています):

var splitList = myList.SelectMany(x => x.Type.Split(", ").Select(t => new myClass(x.ID, x.mukey, x.FieldID, t, x.PercentOfField, x.Acres)).ToList();

もちろん、これはメモリ内のすべての行の新しいコピーを作成するので、長いテーブルにはおそらく最善の解決策ではありません...多分これはより良いでしょう(これもテストされていませんが、あなたは考えを理解します):

var splitList = myList.SelectMany(x => x.Type.Contains(", ") ? x.Type.Split(", ").Select(t => new myClass(x.ID, x.mukey, x.FieldID, t, x.PercentOfField, x.Acres) : new myClass[] {x}).ToList();
于 2012-07-12T15:05:29.920 に答える
0

その列で複数の値を持つアイテムを見つけて削除し、値ごとに1回ずつ、複数回再追加する必要があります。たとえば、リストがタブ区切り文字列のリストであるとすると、次のように機能するはずです。

List<string> records = "...";
foreach (string record in records.ToArray())
{
    string[] fields = record.Split('\t');
    string[] types = fields[3].Split(',');
    if (types.Length > 1)
    {
        records.Remove(record);
        foreach (string type in types)
        {
            fields[3] = type.Trim();
            records.Add(string.Join('\t', fields));
        }
    }
}
于 2012-07-12T15:09:08.550 に答える
0

私はこのコードを、トリックを実行するはずのコンソールアプリケーションで非常にすばやく作成しました。次のような定義を持つ強力な型を扱っていると仮定します。

public class MyObject
{
    public int ID { get; set; }
    public string Mukey { get; set; }
    public int FieldID { get; set; }
    public string Type { get; set; }
    public int PercentOfField { get; set; }
    public double Acres { get; set; }
}

以下を使用すると、あなたが要求していることを実行できます(質問を正しく理解した場合)

var myList = new List<MyObject>()    {
    new MyObject { ID = 1, Mukey = "1709649", FieldID = 191, Type = "Minor", PercentOfField = 18, Acres = 12.5181 },
    new MyObject { ID = 2, Mukey = "1709641", FieldID = 191, Type = "Minor", PercentOfField = 1, Acres = 0.49621 },
    new MyObject { ID = 3, Mukey = "1709620", FieldID = 191, Type = "Minor, Critical", PercentOfField = 72, Acres = 49.4322 },
    new MyObject { ID = 4, Mukey = "1709622", FieldID = 191, Type = "Minor", PercentOfField = 9, Acres = 5.89865 }
};

for (int i = 0; i < myList.Count; i++)
{
    //check if the type is comma delimited
    if (myList[i].Type.Contains(","))
    {
        //get the separate types
        string[] types = myList[i].Type.Split(',');

        var item = myList[i];
        myList.RemoveAt(i);

        //for each type, add a new entry in the list
        foreach (string theType in types)
        {
            myList.Insert(
                i,
                new MyObject
                {
                    ID = item.ID,
                    Mukey = item.Mukey,
                    FieldID = item.FieldID,
                    Type = theType.Trim(),
                    PercentOfField = item.PercentOfField,
                    Acres = item.Acres
                }
            );
            // add to i to offset the count for the additional items 
            // (we want to skip the new items)
            i++;
        }
    }
}
于 2012-07-12T15:23:28.057 に答える