1

私は2つのリストを持っています。1つは文字列リストで、もう1つは1つのクラスのリストです。そのクラスにはsoid、itemname、qtyなどのいくつかのプロパティが含まれ、その値も..文字列リストとクラスリストにはいくつかの共通のプロパティがあります.だから私はチェックしたかったクラス リストを含む文字列リストを作成し、共通の値を 1 つの辞書に追加します。

public class Input
   {
       public string soid { get; set; }

       public string itemname { get; set; }

       public int qty { get; set; }
   }
list<Input> inputclass=new  list<Input>();//inputclass list

List<string> metadata=new List<string>();//string list
metadata.Add("itemname");
        metadata.Add("soid");
        metadata.Add("qty");

クラスメンバー名と文字列リスト名を比較したかったので

4

3 に答える 3

3

あなたのことを 100% 正しく理解できたかどうかはわかりませんが、次の情報が与えられます。

var inputclass= new List<Input>() {
    new Input(){ soid="123", itemname="Bar", qty=123 },
    new Input(){ soid="777", itemname="Foo", qty=999 } 
};
List<string> metadata=new List<string>() { "itemname", "soid", "qty" };

.ToDictionary()このようなand.GetProperty()メソッドを使用できます

Type t = typeof(Input);
var result = metadata.ToDictionary(i => i, i => inputclass.Select(c => t.GetProperty(i).GetValue(c)));

次のような辞書を作成します

ここに画像の説明を入力

編集:

metadataのプロパティではない値を含めることができる場合Input、次のものが保存されます。

var result = metadata.Select(i => t.GetProperty(i))
                     .Where(i => i != null)
                     .ToDictionary(i => i.Name, i => inputclass.Select(c => i.GetValue(c)));
于 2013-04-23T12:21:31.000 に答える
1

私がそれを正しく理解していれば、そのリスト内のインスタンスではなく、タイプ自体を比較する必要があります。

あなたはこのようにすることができます:

List<string> metadata = new List<string>();//string list
metadata.Add("itemname");
metadata.Add("soid");
metadata.Add("qty");
metadata.Add("yada");

var result = from str in metadata
             join prop in typeof(Input).GetProperties() on str equals prop.Name
             select str;

foreach (string prop in result)
{
    Console.WriteLine(prop);
}

不明なオブジェクトのリストがあり、Tそれぞれをメタデータと照合したい場合は、教えてください。お手伝いします.

あなたのコメントに基づいて編集:when we get the common name between list<input> and string how will get the value of corresponding member of the class.now you return only common names r8..?

このようにできます。次の 2 つのクラスがあるとします。

public class Input
{
    public string soid { get; set; }

    public string itemname { get; set; }

    public int qty { get; set; }
}

public class Yada : Input
{
    public string yada { get; set; }
}

4 つのプロパティInputのうち 3 つがあり、Yadaクラスには 4 つすべてがあります。

次に、オブジェクトのリストがあるとします。

List<Input> inputclass = new List<Input>();//inputclass list

inputclass.Add(new Input() { itemname = "test",soid="myId",qty=10 });
inputclass.Add(new Yada() { itemname = "test2",soid="myId2", yada = "woo",qty=20 });

次のコードを使用すると、現在の値を含め、オブジェクトから一致するすべてのプロパティを取得できます。

var result = inputclass.Select(
                 input => (from str in metadata
                           join prop in input.GetType().GetProperties()
                           on str equals prop.Name
                           select new { Obj = input, Prop = str, Value = prop.GetValue(input, null) }))
                           .SelectMany(i => i)
                           .GroupBy(obj => obj.Obj);

foreach (var obj in result)
{
    Console.WriteLine(obj.Key);
    foreach (var prop in obj)
    {
        Console.WriteLine(prop.Prop + ":" + prop.Value);
    }
    Console.WriteLine();
 }

 Console.ReadKey();

ここに私の入力があります:

ここに画像の説明を入力

注意点として、を使用するときは注意してくださいGetValue。たとえば、インデクサーで動作させるには、わずかな変更を加える必要があります。

于 2013-04-23T12:08:03.473 に答える
0

このReflectionExt.GetAttrを使用すると、次のようなことができます。

var dict = new Dictionary<string, List<string>>();

foreach(var listItem in inputclass)
{
   foreach(var metaItem in metadata)
   {
       try
       {
            var value = ReflectionExt.GetAttr(listItem, metaItem);

            if (dict[metaItem] == null)
                dict[metaItem] = new List<string>();

            if (!dict[metaItem].Contains(value)) // Add only if not exists
                dict[metaItem].Add(value);
       }
       catch
       {
           ;
       }

   }

}
于 2013-04-23T12:10:00.290 に答える